【问题标题】:## macro argument concatenation not working as I expected## 宏参数连接没有像我预期的那样工作
【发布时间】:2011-08-09 21:37:06
【问题描述】:

不应该这样吗:

#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);

【问题讨论】:

  • 删除定义中宏名称和(arguments) 之间的空格?这使它在 gcc 中对我有用,但我没有要测试的 MSVC。
  • 终于找到了:? c++ space free language 的可能副本。不能怪你没找到。
  • 哈利路亚,兄弟们,它有效! :D,谢谢安迪成为第一!

标签: c++ macros concatenation c-preprocessor


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2013-04-11
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    • 2023-01-01
    • 2014-06-28
    相关资源
    最近更新 更多