2017-04-10 8 views
1

Betrachten Sie den folgenden Code ein:Erzwingen Erfassung von C Präprozessormakro Wert

#include <stdio.h> 

#define MACRO_A "early" 
#define MACRO_B MACRO_A 
#undef MACRO_A 
#define MACRO_A "late" 
#define MACRO_C MACRO_A 

int main(void) { 
     printf("MACRO_B = %s, MACRO_C = %s\n", MACRO_B, MACRO_C); 
     return 0; 
} 

Ich erwartete, dass MACRO_B den Wert MACRO_A zum Zeitpunkt erfassen würde es definiert wurde, nämlich „früh“. Aber die oben genannten Code druckt:

MACRO_B = late, MACRO_C = late 

Gibt es eine Möglichkeit MACRO_B zu zwingen, den Wert von MACRO_A zu der Zeit zu erfassen sie definiert ist? (NB: Bei Unklarheiten geht wir davon aus gcc verwenden.)

Mein echten Anwendungsfall ist, dass ich eine einzelne Makro Form bin mit unterschiedlichen Ausdehnungen einer gemeinsamen Definition zu erzeugen: eine Erweiterung definiert die struct Layout, eine Neudefinition erstellt die Initialisierer für die Struktur, usw. Dadurch kann ich alle Informationen an einem Ort zu halten.

Aus diesem Grund wäre es nützlich, die "aktuelle" Makroexpansion in einem weiteren Makro zu erfassen, so dass ich die ursprüngliche Definition wiederverwenden könnte, ohne ihren Zustand zu verlieren.

+0

Nein. Die Makrosubstitution erfolgt nur mit den aktuellen Definitionen. Es wäre sonst nicht der C-Präprozessor. –

+0

Ja, es scheint, dass dies wirklich ein Duplikat von http://stackoverflow.com/questions/34486726/c-preprocessor-evaluate-macro-early ist, und trotz der Fokussierung auf Ganzzahlen, ist es besser, die Frage zu beantworten . Gerne, diesen zu löschen ... –

Antwort

0

Diese Art von besiegt den Zweck der Verwendung von Makros. Makros sollten NICHT für globale Variablen verwendet werden.

Eine Alternative ist die Verwendung globaler Variablen. Anstatt Makros zu erstellen, verwenden Sie statische globale Variablen und setzen Sie sie auf den Wert der Makros.

Wie so:

#include <stdio.h> 

#define MACRO_A "early" 
static char* a = MACRO_A; 
#define MACRO_B MACRO_A 
static char* b = MACRO_B; 
#undef MACRO_A 
#define MACRO_A "late" 
#define MACRO_C MACRO_A 
static char* c = MACRO_C; 

int main(void) { 
     printf("MACRO_B = %s, MACRO_C = %s\n", a, c); 
     return 0; 
} 
+0

Nun, genau so benutze ich die Makros. Ich hoffte nur, dass ich meine .h-Dateien (Makrodefinitionen) nicht mit meinen .c-Dateien (Makroerweiterungen) mischen musste, wenn Sie verstehen, was ich meine. Aber ich kann den Code umstrukturieren, um es zu vermeiden. –

0

Als C-Präprozessor ersetzt nur Text von anderem Text, passieren folgende, wenn die printf Linie verarbeitet werden:

  • MACRO_B wird durch den Text ersetzt werden MACRO_A wie zuvor definiert;
  • In einer rekursiven Weise wird MACRO_A durch seine aktuelle Definition ersetzt: "late"

In gleicher Weise:

  • MACRO_C wird durch MACRO_A zuvor definiert ersetzt werden;
  • Dann wird auf rekursive Weise MACRO_A durch "late" ersetzt.
Verwandte Themen