##宏参数连接不能按我的预期工作

时间:2011-04-20 22:50:36

标签: c++ macros concatenation c-preprocessor

不应该这样:

#define MOGSH_CONCAT (x,y) x##y
#define MOGSH_DOUBLE (a,b) MOGSH_CONCAT(a,b)
#define MOGSH_DEFINEPROC (p) MOGSH_DOUBLE(_gt,p) options_dialog::p;

MOGSH_DEFINEPROC(AssignMainForm);

愉快地扩展到:

_gtAssignMainForm options_dialog::AssignMainForm;

鉴于_gt未定义,_gtAssignMainForm为:

typedef void (__stdcall *_gtAssignMainForm)();

options_dialog只是AssignMainForm是静态成员的类。

相反,在MSVC9中,我收到错误:

'a' : undeclared identifier

在包含

的行上
MOGSH_DEFINEPROC(AssignMainForm);

1 个答案:

答案 0 :(得分:3)

在类函数宏的定义中,宏名称与开始参数列表的(之间不能有空格。

#define MOGSH_CONCAT(x,y) x##y 
//                  ^ no whitespace allowed here

正如您现在拥有的那样(使用空格),MOGSH_CONCAT是一个类似对象的宏,其替换列表为(x,y) x##y,这就是您获得如此奇怪结果的原因。