预处理器:只展开一次宏

Pre-processor: Expand a macro only once

是否可以只展开一次宏?在以下示例中,MYCONCAT 扩展为 func_1(10)。我希望它扩展到 func_BAR(10).

#define BAR 1  // included from a file I cannot change
#define FOO BAR

#define MYCONCAT2(c) func_ ## c
#define MYCONCAT(c, x) MYCONCAT2(c)(x)

MYCONCAT(FOO, 10) // is 'func_1(10)', but I want it to be 'func_BAR(10)'

Is it possible to have a macro expanded only once?

不,不能部分展开宏。

仅在使用 MYCONCAT 的最后一个位置之后(使用扩展到 BAR 的内容)而不是之前包含定义 BAR 的文件。

只需将 #define BAR 更改为 #define _BAR,然后从 func 中删除 _

#define BAR 1  // included from a file I cannot change
#define FOO _BAR

#define MYCONCAT2(c) func ## c
#define MYCONCAT(c, x) MYCONCAT2(c)(x)

MYCONCAT(FOO, 10) // 'func_BAR(10)'