《深入浅出MFC》中的宏:IMPLEMENT_RUNTIMECLASS解决办法
《深入浅出MFC》中的宏:__IMPLEMENT_RUNTIMECLASS
《深入浅出》第3章对RTTI进行了仿真。
其中,用到了_IMPLEMENT_RUNTIMECLASS宏,定义如下:
======================
#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_name ; } \
==========================
其中的:static char _lpsz##class_name[] = #class_name; 是什么意
思啊?_lpsz##class_name[]从名字看是指针,但又好像是数组。
“#class_name "将”# "和 “class_name "组合起来又是何意?是对左面
的指针赋值?或者说是对数组初始化?还是其他什么?
请达人赐教。
------解决方案--------------------
假如你的类叫做test
那么展开之后的结果就是
char _lpsztest[]= "test "
用于在动态识别的时候判断是否是一个类.
------解决方案--------------------
依稀记得#是用来连接字符串的
------解决方案--------------------
转化为字符串
------解决方案--------------------
## 是连接_lpsz和class_name,成为一个数组名.
# 是将后面的class_name转化为一个C中以NULL结尾的字符数组. (与_lpsz 相对应.)
《深入浅出》第3章对RTTI进行了仿真。
其中,用到了_IMPLEMENT_RUNTIMECLASS宏,定义如下:
======================
#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_name ; } \
==========================
其中的:static char _lpsz##class_name[] = #class_name; 是什么意
思啊?_lpsz##class_name[]从名字看是指针,但又好像是数组。
“#class_name "将”# "和 “class_name "组合起来又是何意?是对左面
的指针赋值?或者说是对数组初始化?还是其他什么?
请达人赐教。
------解决方案--------------------
假如你的类叫做test
那么展开之后的结果就是
char _lpsztest[]= "test "
用于在动态识别的时候判断是否是一个类.
------解决方案--------------------
依稀记得#是用来连接字符串的
------解决方案--------------------
转化为字符串
------解决方案--------------------
## 是连接_lpsz和class_name,成为一个数组名.
# 是将后面的class_name转化为一个C中以NULL结尾的字符数组. (与_lpsz 相对应.)