不应该这样:
#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);
最佳答案
在类函数宏的定义中,宏名称和参数列表开头的 (
之间不能有空格。
#define MOGSH_CONCAT(x,y) x##y
// ^ no whitespace allowed here
正如您现在所拥有的(带有空格),MOGSH_CONCAT
是一个类似对象的宏,带有 (x,y) x##y
的替换列表,它是为什么你会得到如此奇怪的结果。
关于c++ - ## 宏参数连接没有像我预期的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5737533/