Preprocessor token expansion [duplicate]

2019-03-12 18:23发布

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?

2条回答
神经病院院长
2楼-- · 2019-03-12 18:45

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

查看更多
闹够了就滚
3楼-- · 2019-03-12 18:47

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
查看更多
登录 后发表回答