在宏定义中使用多个宏

我试图在另一个宏的定义中使用多个宏,但似乎有问题将它们连接在一起。 这是我正在尝试做的非常简化的版本:

#include  #define PICK_SET_A #ifdef PICK_SET_A #define SET A #endif #ifdef PICK_SET_B #define SET B #endif #define ENABLE_VAR_1_A 1 #define ENABLE_VAR_2_A 1 #define ENABLE_VAR_1_B 0 #define ENABLE_VAR_2_B 0 #define MACRO_RESOLVE(var,set) ENABLE_VAR_##var##_##set #define ENABLE_VAR_1 MACRO_RESOLVE(1, SET) #define ENABLE_VAR_2 MACRO_RESOLVE(2, SET) int main(int argc, char **argv) { fprintf(stdout, "VALUE: %d\n", ENABLE_VAR_1); return 0; } 

我希望结果为0

但是,我收到编译错误,因为MACRO_RESOLVE宏没有解决我期望它的方式:

 $ gcc -o asdf asdf.c asdf.c:25:36: error: use of undeclared identifier 'ENABLE_VAR_1_SET' fprintf(stdout, "VALUE: %d\n", ENABLE_VAR_1); ^ asdf.c:20:26: note: expanded from macro 'ENABLE_VAR_1' #define ENABLE_VAR_1 MACRO_RESOLVE(1, SET) ^ asdf.c:18:32: note: expanded from macro 'MACRO_RESOLVE' #define MACRO_RESOLVE(var,set) ENABLE_VAR_##var##_##set ^ :229:1: note: expanded from here ENABLE_VAR_1_SET ^ 1 error generated. 

因此,当我定义ENABLE_VAR_1时,看起来SET没有得到扩展。

由于您正在尝试构建宏名称,因此您需要在此过程中进行足够的中间扩展以扩展所有令牌。 在这里看到它。

 #include  #define PICK_SET_A #ifdef PICK_SET_A #define SET A #endif #ifdef PICK_SET_B #define SET B #endif #define ENABLE_VAR_1_A 1 #define ENABLE_VAR_2_A 1 #define ENABLE_VAR_1_B 0 #define ENABLE_VAR_2_B 0 #define MACRO_RESOLVE__(M) M #define MACRO_RESOLVE_(V, S) MACRO_RESOLVE__(ENABLE_VAR_ ## V ##_## S) #define MACRO_RESOLVE(var,set) MACRO_RESOLVE_(var, set) #define ENABLE_VAR_1 MACRO_RESOLVE(1, SET) #define ENABLE_VAR_2 MACRO_RESOLVE(2, SET) int main(int argc, char **argv) { fprintf(stdout, "VALUE: %d\n", ENABLE_VAR_1); return 0; }