读书人

DECLARE_DYNAMIC宏的一些有关问题

发布时间: 2012-03-16 16:34:56 作者: rapoo

DECLARE_DYNAMIC宏的一些问题
DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
virtual CRuntimeClass* GetRuntimeClass() const; \
static const AFX_DATA CRuntimeClass class##class_name; \
/////////请问GetRuntimeClass,_GetBaseClass函数是全局函数还是class_name的成员函数?

IMPLEMENT_DYNAMIC(class_name, base_class_name)\
CRuntimeClass* PASCAL class_name::_GetBaseClass() \

//这不是表明_GetBaseClass是class_name的成员函数了吗?不太明白宏里定义函数的规则。


{ \
return RUNTIME_CLASS(base_class_name); \
} \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ \
return RUNTIME_CLASS(class_name); \
} \
AFX_COMDAT const AFX_DATADEF \
CRuntimeClass class_name::class##class_name = \
{ \
#class_name, \
sizeof(class class_name), \
0xFFFF, \
NULL, \
NULL, \
&class_name::_GetBaseClass, \
NULL \
};\
#class_name是什么意思?





[解决办法]
GetRuntimeClass,_GetBaseClass是class_name的成员函数,因为你的DECLARE_DYNAMIC是写在类定义里的
[解决办法]
##是动态连接类名用的。CRuntimeClass class##class_name假如class_name是A,那么实际运行的名称是:classA;
[解决办法]
## 连接符与# 符

## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。
#符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。
[解决办法]
MSDN:
The number-sign or “stringizing” operator (#) converts macro parameters (after expansion) to string constants. It is used only with macros that take arguments.

宏的连接符,告诉编译器,"#"后是一个对象名,而不是一个字符串.

读书人网 >VC/MFC

热点推荐