2016-11-06 6 views
0

Ich versuche, mehrere Makros in der Definition eines anderen Makros zu verwenden, aber scheinen Probleme bei der Verkettung zu haben. Hier ist eine sehr vereinfachte Version von dem, was ich versuche zu tun:Verwenden Sie mehrere Makros in einer Makrodefinition

#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; 
} 

ich das Ergebnis 0 erwarten.

Aber ich bin immer Fehler kompilieren, weil das MACRO_RESOLVE Makro den Weg nicht zu lösen Ich erwarte, dass es an:

$ 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. 

So sieht es aus wie SET nicht erweitert wird, wenn ich ENABLE_VAR_1 definieren.

+0

Ich würde mit anderen Lösungen für dieses Problem in Ordnung sein. Das Hauptziel ist es, zwei Makros in die Definition eines anderen Makros einfügen zu können. –

+0

Warum versuchen Sie das mit Makros? –

+0

Related: [* Warum ist eine Ebene der Indirektion für dieses Verkettung Makro erforderlich? *] (Http://stackoverflow.com/questions/19666142) – DaoWen

Antwort

1

Da Sie versuchen, einen Makronamen zu erstellen, müssen Sie auf dem Weg genügend Zwischenerweiterungen vornehmen, damit alle Token erweitert werden können. Sehen Sie es 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; 
} 
Verwandte Themen