MFC的RUNTIMECLASS 的探讨

高手请指教

在多文档的程序中, InitInstance()这个关键的初始化函数中有这样一段代码

************************************************************

CMultiDocTemplate* pDocTemplate;
 pDocTemplate = new CMultiDocTemplate(
  IDR_PAINTETYPE,
  RUNTIME_CLASS(CPainterUsePatternDoc),
  RUNTIME_CLASS(CChildFrame), // custom MDI child frame
  RUNTIME_CLASS(CPainterUsePatternView));
 AddDocTemplate(pDocTemplate);

*************************************************************

里面的RUNTIME_CLASS没有见过,是什么东东?

在AFX.H里面有源代码

*************************************************************

#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))

#define ASSERT_KINDOF(class_name, object) /
 ASSERT((object)->IsKindOf(RUNTIME_CLASS(class_name)))

*************************************************************

这个定义我又有不明白,"##"是什么东东??在MSDN中查到

*************************************************************

#define paster( n ) printf( "token" #n " = %d", token##n ) int token9 = 9; 

//将paster(n)定义为printf( "token" #n " = %d", token##n )

//那么
paster( 9 );//这个函数等同于以下函数
printf( "token" "9" " = %d", token9 );

//就变成了

printf( "token9 = %d", token9 );

***********************************************************

我们明白了'##'实际上就是连接两个字符串,回到刚才的定义

#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))

宏定义RUNTIME_CLASS(class_name)为((CRuntimeClass*)(&class_name::class##class_name))

class_name是一个参数,代表了类名

CRuntimeClass是一个结构

将class_name类的一个叫做class##class_name 的结构的地址取出将其类

型转换为struct CRuntimeClass *类型

 

(待续)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值