C预处理器如何用##展开宏


英语不是我的母语;因此我展示了要描述的代码。
#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做到了?

根据CppReference,

替换列表中任意两个连续标识符之间的##运算符对两个标识符(不是首先宏展开的(执行参数替换,然后连接结果。

##运算符对标识符本身进行操作,因此如果您想"使字符串为文字";或者将CCD_ 8-d宏的值连接起来。

相关内容

  • 没有找到相关文章

最新更新