不应该这样:
#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);
答案 0 :(得分:3)
在类函数宏的定义中,宏名称与开始参数列表的(
之间不能有空格。
#define MOGSH_CONCAT(x,y) x##y
// ^ no whitespace allowed here
正如您现在拥有的那样(使用空格),MOGSH_CONCAT
是一个类似对象的宏,其替换列表为(x,y) x##y
,这就是您获得如此奇怪结果的原因。