Ich weiß, dass dies eine lange Zeit nach der ursprünglichen Abfrage ist, aber dies kann immer noch nützlich sein.
Dies kann in GCC mit dem Stringify-Operator "#" erfolgen, erfordert jedoch zwei Stufen.
#define XSTR(x) STR(x)
#define STR(x) #x
Der Wert eines Makros kann dann angezeigt werden mit:
#pragma message "The value of ABC: " XSTR(ABC)
Siehe: 3.4 Stringifizierung in der gcc Online-Dokumentation.
Wie es funktioniert:
Der Präprozessor versteht Zeichenfolgen in Anführungszeichen und behandelt sie anders als normalen Text. Die Verkettung von Zeichenfolgen ist ein Beispiel für diese spezielle Behandlung. Das Nachrichtenpragma erfordert ein Argument, das eine Zeichenfolge in Anführungszeichen ist. Wenn das Argument mehr als eine Komponente enthält, müssen alle Zeichenfolgen sein, damit die Verkettung von Zeichenfolgen angewendet werden kann. Der Präprozessor kann niemals davon ausgehen, dass eine nicht in Anführungszeichen gesetzte Zeichenfolge so behandelt werden sollte, als ob sie in Anführungszeichen gesetzt wäre. Wenn ja, dann:
#define ABC 123
int n = ABC;
würde nicht kompilieren.
Betrachten Sie nun:
#define ABC abc
#pragma message "The value of ABC is: " ABC
das ist äquivalent zu
#pragma message "The value of ABC is: " abc
Dies führt zu einer Präprozessorwarnung, da abc (nicht in Anführungszeichen) nicht mit der vorhergehenden Zeichenfolge verkettet werden kann.
Betrachten Sie nun die Präprozessor-Stringisierung (die früher als Stringifizierung bezeichnet wurde). Die Links in der Dokumentation wurden geändert, um die überarbeitete Terminologie widerzuspiegeln. (Beide Begriffe sind übrigens gleichermaßen verabscheuungswürdig. Der richtige Begriff ist natürlich Stringifaction. Seien Sie bereit für die Aktualisierung Ihre Links.)) Betreiber. Dies wirkt sich nur auf die Argumente eines Makros aus und ersetzt das nicht erweiterte Argument durch das in doppelte Anführungszeichen eingeschlossene Argument. So:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
weist s1 und s2 identische Werte zu. Wenn Sie gcc -E ausführen, können Sie dies in der Ausgabe sehen. Vielleicht würde STR besser so etwas wie ENQUOTE heißen.
Dies löst das Problem, Anführungszeichen um ein nicht in Anführungszeichen gesetztes Element zu setzen. Das Problem besteht nun darin, dass das Makro nicht erweitert wird, wenn das Argument ein Makro ist. Aus diesem Grund wird das zweite Makro benötigt. XSTR erweitert sein Argument und ruft dann STR auf, um den erweiterten Wert in Anführungszeichen zu setzen.