C 嵌套宏

标签 c c-preprocessor

为什么在一种情况下嵌套宏有效而在另一种情况下无效?

情况1:

#define name(val) #val
#define name2(front, back) name(front ## back)
...

printf("%s\n", name2(foo, bar));   // foobar

案例2:
#define paste(front, back) front ## back
#define name(val) #val
#define name2(front, back) name(paste(front, back))
...


printf("%s\n", name2(foo, bar));   // paste(foo, bar)

最佳答案

因为如果宏的参数与 # 一起出现,则它们不会被扩展。或 ##在宏体中(与 val 中的 name 的情况一样)。请参阅 this question 的已接受答案.

因此,在第二种情况下,您需要添加一个中间步骤以确保扩展参数。例如。就像是:

#define paste(front, back) front ## back
#define name(val) #val
#define expand(val) name(val)  // expand val before stringifying it
#define name2(front, back) expand(paste(front, back))

关于C 嵌套宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458649/

相关文章:

在不使用字符串的情况下计算字符被键入的次数

c - 从环境变量生成 #include 宏

c++ - 如何构建本地唯一标识符名称?

C++模板实例化: Avoiding long switches

c - 如何在 C 中使用 ## 实现循环

在我的代码中找不到错误? C

c - 在 c : func(void) vs. 中

C中字符串大写

c - 指向结构的指针在每次函数调用时变为 NULL

#define 指令中的 C 类型转换