C预处理器如何使用##扩展宏?

6

英语不是我的母语;因此我展示代码来阐述。

#define concat_temp(x, y) x##y
#define concat(x, y) concat_temp(x, y)
#define BAR 2

int main() {
    concat_temp(FOO, BAR)
    concat(FOO, BAR)
}

当我执行clang -E命令时,宏被展开为:
int main() {
    FOOBAR
    FOO2
}

谁能解释一下为什么concat_temp不能将bar扩展到2,而concat可以做到?


不错!从来不知道这样的事情。但也好,我不知道,因为我完全避免使用宏 :-) - Klaus
1
有趣的事实是,concat_temp(FOO, (BAR)) 可能仍然会产生 FOO2。我认为可能是错误的,并且取决于编译器。 - Shark
@Shark <编译失败>lol - unlsycn
@unlsycn 好的,我明白了,我已经十年没碰过这个宏的东西了。看来编译器从那时起就进化了 :D - Shark
1个回答

5
根据 CppReference,在替换列表中每两个连续的标识符之间使用一个 ## 运算符时,运行参数替换在这两个标识符上(首先不进行宏扩展),然后连接结果。
由于 ## 运算符作用于标识符本身,如果要 "制作字符串字面值" 或者连接 #define 宏的值,则需要另一遍宏扩展。

避免了我9秒钟的复制锤。 ;D - Ayxan Haqverdili
1
@AyxanHaqverdili 实际上,还有4个小时可用。 - iBug
哇,它确实起作用了。我要滥用这个能力... - Ayxan Haqverdili

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