gcc的宏扩展问题

时间:2019-03-07 21:44:15

标签: gcc macros

在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中执行此操作的等效方法是什么?

1 个答案:

答案 0 :(得分: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`}};

在展开的宏中,您似乎有一个多余的/缺少括号}

希望有帮助。