预处理程序令牌扩展

fre*_*low 15 c c++ c-preprocessor

我对预处理器如何工作的心理模型显然是不完整的,这让我发疯.

我想连接两个标记,但第二个标记应该首先扩展.

#define ANSWER 42

#define FOO foo_ ## ANSWER
Run Code Online (Sandbox Code Playgroud)

在这里,FOO扩展到foo_ANSWER,但我希望它foo_42.所以我定义了一个MERGE宏,希望在连接之前以某种方式扩展参数:

#define MERGE(x, y) x ## y

#define BAR MERGE(bar_, ANSWER)
Run Code Online (Sandbox Code Playgroud)

BAR仍然扩大到bar_ANSWER而不是bar_42.所以我定义了另一个宏HELPER:

#define HELPER(x, y) MERGE(x, y)

#define BAZ HELPER(baz_, ANSWER)
Run Code Online (Sandbox Code Playgroud)

现在BAZ已成功扩展到baz_42.目前,这对我来说似乎很神奇.

任何人都可以向我解释这种行为吗?扩展规则如何正常工作?

Sim*_*one 8

这里阅读你的问题的答案:

问题是当你有宏替换时,如果字符串化操作符#和标记粘贴操作符##都没有应用于它,预处理器将只递归地扩展宏.因此,您必须使用一些额外的间接层,您可以使用带有递归扩展参数的token-pasting运算符