2016-11-06 15 views
0

私は別のマクロの定義で複数のマクロを使用しようとしていますが、それらを一緒に連結する際に問題があるようです。ここで私は何をしようとしているのは非常に単純化したバージョンです:マクロ定義で複数のマクロを使用する

#include <stdio.h> 

#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 
          ^
<scratch space>:229:1: note: expanded from here 
ENABLE_VAR_1_SET 
^ 
1 error generated. 

だから、それは私がENABLE_VAR_1を定義する際に、拡張取得されていないSETのように見えます。

+0

この問題の解決方法は他にも問題ありません。主な目的は、このような別のマクロの定義に2つのマクロを挿入できるようにすることです。 –

+0

なぜマクロでこれをやろうとしていますか? –

+0

関連性:[*なぜこの連結マクロに必要なインダイレクションのレベル?](http://stackoverflow.com/questions/19666142) – DaoWen

答えて

1

マクロ名を作成しようとしているので、途中で十分な中間展開を行い、すべてのトークンを展開する必要があります。それを参照してくださいlive here

#include <stdio.h> 

#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; 
} 
関連する問題