## 宏参数串联没有按我的预期工作
难道不应该:
#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);
Shouldn't this:
#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);
happily expand to:
_gtAssignMainForm options_dialog::AssignMainForm;
Given that _gt
is not defined, _gtAssignMainForm
is:
typedef void (__stdcall *_gtAssignMainForm)();
and options_dialog
is just a class where AssignMainForm
is a static member.
Instead, in MSVC9, I get the error:
'a' : undeclared identifier
on the line containing
MOGSH_DEFINEPROC(AssignMainForm);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在类函数宏的定义中,宏名称和参数列表开头的
(
之间不能有空格。正如您现在所看到的(带有空格),
MOGSH_CONCAT
是一个类似对象的宏,其替换列表为(x,y) x##y
,这就是为什么您会得到如此奇怪的结果。In the definition of a function-like macro there can be no whitespace between the macro name and the
(
beginning the parameter list.As you have it now (with whitespace),
MOGSH_CONCAT
is an object-like macro with a replacement list of(x,y) x##y
, which is why you are getting such strange results.