【问题标题】:Macro expansion issue with gccgcc 的宏扩展问题
【发布时间】:2019-03-07 21:44:14
【问题描述】:

在 gcc 中,稍后在同一扩展中引用宏扩展的结果似乎不起作用。例如:

#define TESTMACRO(name) \
        static int name##_func(int solNo) { \
                return (solNo); \
        }\
        static int name##Thing = {0,##name##_func},NULL,{"", capInvSw##name}}; 

TESTMACRO(stuff)

这会导致如下错误:

test.c:7:29: error: pasting "," and "stuff" does not give a valid preprocessing token
  static int name##Thing = {0,##name##_func},NULL,{"", capInvSw##name`}}; 
                             ^
test.c:9:1: note: in expansion of macro ‘TESTMACRO’
 TESTMACRO(stuff)

我希望创建一个名为 stuff_func 的函数并将其传递给 stuffThing。我相信这适用于其他编译器。在 gcc 中执行此操作的等效方法是什么?

【问题讨论】:

  • 你的预处理器输出为扩展提供了什么?
  • 看起来你在宏体中有一个虚假的额外##,这就是错误消息所抱怨的......

标签: gcc macros


【解决方案1】:

您可以尝试通过传递-E 标志仅在您的代码上运行预处理器:

gcc -E foo.c

将您的宏评估为:

static int stuff_func(int solNo) { return (solNo); } static int stuffThing = {0,stuff_func},NULL,{"", capInvSwstuff`}};

为了便于阅读,可以扩展为:

static int stuff_func(int solNo) { 
return (solNo); 
} 

static int stuffThing = {0,stuff_func},NULL,{"", capInvSwstuff`}};

您的扩展宏中似乎有一个额外/缺失的括号}

希望对你有帮助。

【讨论】:

  • 啊,是的,这是一个人为的例子,旨在消除现实生活中的 pinmame 问题中的一些歧义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多