<深入浅出MFC>中Fream3中这些代码看不懂是什么????

#include"stdafx.h"#defineBOOLint#defineTRUE1#defineFALSE0#defineLPCTSTRLPSTRtypedefch... #include "stdafx.h"
#define BOOL int
#define TRUE 1
#define FALSE 0
#define LPCTSTR LPSTR
typedef char* LPSTR;
#define UNIT int
#define PASCAL _stdcall

#include <iostream>
using namespace std;

class CObjcet;

struct CRuntimeClass
{
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema;
CObject*(PASCAL *m_pfnCreateObject)();
CRuntimeClass * m_pNextClass;

static CRuntimeClass * m_pBaseClass;
CRuntimeClass *m_pNextClass;

};

struct AFX_CLASSINIT
{
AFX_CLASSINIT(CRuntimeClass*pNewClass);
};

#define RUNTIME_CLASS(class_name) \
(&class_name::class##class_name)

#define DECLARE_DYNAMIC(class_name)\
public:\
static CRuntimeClass class##class_name;\
virtual CRuntimeClass* GetRuntimeClass() const;

#define _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew)\
static char _lpsz##class_name::[]=#class_name;\
CRuntimeClass class_name::class##class_name={\
_lpsz##class_name,sizeof(class_name),wSchema,pfnNew,\
RUNTIME_CLASS(base_class_name),NULL};\

static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);\
CRuntimeClass* class_name::GetRuntimeClass() const\
{ return &class_name::class##class_anme;}\

#define IMPLEMENT_DYNAMIC(class_name,base_class_name)\
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)

怎么还有反斜线,是什么这么一堆
展开
 我来答
Drawing_zy
2011-02-13
知道答主
回答量:6
采纳率:0%
帮助的人:0
展开全部
☆《深入浅出MFC》MFC仿真——动态类型识别RTTI
我们作为类库的设计者要在类构造起来的时候,记录必要的信息,以建立型录。型录中的类的信息,最好以链表方式连接起来。一般“类别型录”是一个结构,其中至少需要类名字,链表的Next指针,以及链表的First指针。First属于整体变量,一份就好,所以用static修饰。
为了将每一个类都能拥有成员变量集合,并且最好有一定的命名规则,然后经某种手段将整个类库构造好之后,“类别型录”(就是各个CRuntimeClass对象)则能呈现为:
☆什么是DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC 宏?
作用就是完成RTTI的“类别型录”。为了将一个类对象塞到类之中,并定义一个可以捕捉到该对象地址的函数,定义一个宏为:
#define DECLARE_DYNAMIC(class_name)
public:
static CRuntimeClass class##class_name;
virtual CRuntimeClass* GetRuntimeClass()const;

将类放入DECLARE_DYNAMIC宏就是把要放的对象放到了里边。具体连接工作是由IMPLEMENT_DYNAMIC宏来实现:
#define IMPLEMENT_DYNAMIC(class_name,base_class_name)
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)
IMPLEMENT_DYNAMIC内容制定初值,使用了一个struct AFX_CLASSINIT {AFX_CLASSINTI(CRuntimeClass * pNewClass);};
AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass*pNewClass)
{ pNewClass->m_NextClass = CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass = pNewClass;
}
就是上边的这个构造函数完成了连接工作。

在宏定义中,出现的##说明将前后两部分连接在一起,出现#说明将#后的部分转换成字符串。
暴击的幸运
2011-02-08 · TA获得超过266个赞
知道小有建树答主
回答量:113
采纳率:0%
帮助的人:185万
展开全部
反斜线代表下一行是这一行的继续,因为宏定义中间不能有回车和空格
比如
#define RUNTIME_CLASS(class_name) \
(&class_name::class##class_name)
相当于
#define RUNTIME_CLASS(class_name) (&class_name::class##class_name)

而##表示把前面的名字和后面的接起来
比如class_name为abc时
class##class_name就相当于classabc

以上代码是MFC自动生成的,主要定义一些常用的运行时类型检查宏,初学的话没有必要看懂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
望穿秋水待伊人
2011-02-09 · TA获得超过644个赞
知道小有建树答主
回答量:708
采纳率:100%
帮助的人:791万
展开全部
这些就是类型声明 和宏定义,反斜线意思是就是一行代码分成多行写,告诉编译器这一句没有结束,由于宏定义没有分号结束符,所以要一句写成多行就要加上反斜线,不然编译器是不知道 的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
knkhjc
2011-02-09 · TA获得超过1724个赞
知道小有建树答主
回答量:1614
采纳率:0%
帮助的人:300万
展开全部
妹子啊现如今想找个好男人不容易啊你可要好好把握哦。我也是朋友介绍的咨询师,在他的指引下我顺利的通过了老公那一关,我现在的生活很不错;哪个男人都希望是自己的女人的唯一!所以我也向你推荐:如果有需要,可以加咨询师扣扣 号,前四位数:陆四一六、后五位数:二零⑦八捌;他也会指导你。希望你能得到和我一样的幸福.祝你成功
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式