C预处理器的记号化不会展开宏吗?

10

1) 为什么宏MSG在以下表达式中没有被展开?

#define MSG Hello
#define HELLO(name)  MSG ## name

void HELLO(Dave) () {}

使用

gcc -E -P test.cpp 

输出:

void MSGDave () {}

MSG name扩展为Hello Dave。而MSG # name扩展为Hello "Dave"。那么是什么导致gcc无法扩展MSG ## name

2)是否有解决方法?

是否有像defined(x)那样的预处理器指令,比如expand(x)?

2个回答

5
由于宏参数在前面或后面跟随一个##操作符时不会被替换。
引用:

C11 §6.10.3.1 参数替换

在识别出函数式宏调用的参数之后,进行参数替换。替换列表中的参数(除非其前面有一个###预处理标记,或者其后面有一个##预处理标记(见下文))在其中包含的所有宏都已经扩展之后,将被相应的参数替换。在被替换之前,每个参数的预处理标记都将被完全宏替换,就像它们组成了预处理文件的其余部分一样;没有其他的预处理标记可用。


不错。你答对了问题的一半——为什么它没有展开。然后@n.m.给出了另一个非常重要的部分——解决方法。 - Brent Faust

3

太好了!这是答案的第二个也是最重要的部分 - 解决方法。@Yu先回答了原因 - 这个“bug”是设计上的。 - Brent Faust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接