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