问题
My mental model of how the preprocessor works is apparently incomplete, and this is driving me crazy.
I want to concatenate two tokens, but the second token should be expanded first.
#define ANSWER 42
#define FOO foo_ ## ANSWER
Here, FOO
expands to foo_ANSWER
, but I want it to be foo_42
. So I define a MERGE
macro in the hopes that this would somehow expand the arguments before concatenation:
#define MERGE(x, y) x ## y
#define BAR MERGE(bar_, ANSWER)
But BAR
still expands to bar_ANSWER
instead of bar_42
. So I define another macro HELPER
:
#define HELPER(x, y) MERGE(x, y)
#define BAZ HELPER(baz_, ANSWER)
And now BAZ
is successfully expanded to baz_42
. At the moment, this seems like magic to me.
Can anyone explain this behavior to me? How do the expansion rules work exactly?
回答1:
Read the answer to your question here:
The problem is that when you have a macro replacement, the preprocessor will only expand the macros recursively if neither the stringizing operator # nor the token-pasting operator ## are applied to it. So, you have to use some extra layers of indirection, you can use the token-pasting operator with a recursively expanded argument
回答2:
Token concatenation does not expand macros when performing concatenation [ref].
To get past this, you use a level of indirection, and get the preprocessor to expand the macros before the concatenation.
#define STEP1(x, y) STEP2(x, y) // x and y will be expanded before the call to STEP2
#define STEP2(x, y) x ## y // x and y will not be expanded, just pasted
来源:https://stackoverflow.com/questions/4284733/preprocessor-token-expansion