C预处理器标记化不会扩展宏?

Bre*_*ust 9 c macros gcc c99 c-preprocessor

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

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

void HELLO(Dave) () {}
Run Code Online (Sandbox Code Playgroud)

运用

gcc -E -P test.cpp 
Run Code Online (Sandbox Code Playgroud)

输出:

void MSGDave () {}
Run Code Online (Sandbox Code Playgroud)

MSG name扩展到Hello Dave.并MSG # name扩展到Hello "Dave".那么是什么导致gcc不扩展MSG ## name

2)有解决方法吗?

是否有像预定义(x)这样的预处理程序指令,例如expand(x)?

Yu *_*Hao 5

因为在##运算符之前或之后没有替换宏参数.

C11§6.10.3.1参数替换

在确定了调用类函数宏的参数之后,发生了参数替换.在替换列表中的参数,除非前面有一个###预处理记号或后跟一个##预处理标记(见下文),由对应的参数替换后其中所含的所有宏已经扩大.在被替换之前,每个参数的预处理标记都被完全宏替换,好像它们形成了预处理文件的其余部分; 没有其他预处理令牌可用.


n. *_* m. 3

#define MSG Hello
#define cat(x, y) x ## y
#define cat2(x, y) cat(x, y)
#define HELLO(name) cat2(MSG,name)
Run Code Online (Sandbox Code Playgroud)

现场演示@ideone