VC宏定义 ## 说明
在分析代码文件时经常见到下面的宏定义:
例1:
#define __CRT_WIDE(_String) L##_String
举例说明:
wprintf( __CRT_WIDE("Hello world") );
预处理后是
wprintf( L"Hello World" );
如果把 ## 去掉
#define __CRT_WIDE(_String) L_String
__CRT_WIDE(_String) 中的 _String 无论是什么, 经过预处理后的
结果都是 L_String
wprintf( __CRT_WIDE("Hello world") );
此时编译器报告错误:
error: 'L_String' : undeclared identifier
----------------------------------------------------------------------------------------------------------------------------
例 2:
下面是 ATL 中 SmartPoint 的简化定义:
// ATL 智能指针
#define DECLARE_SMARTPTR(ifacename) /
typedef CComQIPtr
SP##ifacename;
在项目代码中的下面语句:
DECLARE_SMARTPTR( IHTMLDocument2 ) ;
预处理后是:
typedef CComQIPtr< IHTMLDocument2 > SPIHTMLDocument2 ;
以后就能用 SPIHTMLDocument2(变量类型) 定义 指向 IHTMLDocument2 接口的指针。
SPIHTMLDocument2 iHtmlDoc ;
注意点:
(1) #define __CRT_WIDE(_String) L##_String 和 #define __CRT_WIDE(_String) L ## _String 相同
即: ## 2 侧空格有无和多少没有关系.
(2) 通常情况是替换紧挨 ## 2 侧的部分
(3) ## 使宏替换整体的一部分