Preprocessor token expansion [duplicate]

我们两清 提交于 2019-12-31 12:53:08

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!