Mit mindestens einigen C- Präprozessoren können Sie den Wert eines Makros anstelle seines Namens stringisieren, indem Sie es über ein funktionsähnliches Makro an ein anderes übergeben, das es stringiert:
#define STR1(x) #x
#define STR2(x) STR1(x)
#define THE_ANSWER 42
#define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */
Beispielanwendungsfälle hier .
Dies funktioniert zumindest in GCC und Clang (beide mit -std=c99
), aber ich bin mir nicht sicher, wie es in C-Standard-Begriffen funktioniert.
Ist dieses Verhalten durch C99 garantiert?
Wenn ja, wie garantiert C99 dies?
Wenn nicht, ab wann wechselt das Verhalten von C-definiert zu GCC-definiert?
c
c-preprocessor
stringification
Peter Hosey
quelle
quelle
Antworten:
Ja, das ist garantiert.
Dies funktioniert, weil Argumente für Makros selbst makroerweitert sind, außer wenn der Name des Makroarguments im Makrotext mit dem Stringifier # oder dem Token-Paster ## angezeigt wird.
6.10.3.1/1:
Wenn Sie dies tun, erhalten
STR1(THE_ANSWER)
Sie "THE_ANSWER", da das Argument von STR1 nicht durch Makros erweitert ist. Das Argument von STR2 wird jedoch makroerweitert, wenn es in die Definition von STR2 eingesetzt wird, wodurch STR1 ein Argument von42
mit dem Ergebnis "42" erhält .quelle
Als Steve Notizen wird diese guarenteed, und es hat sich seit dem C89 - Standard guarenteed worden - , dass der Standard der kodifizierten die war # und ## Operatoren in Makros und Mandate rekursiv Makros in args erweitern , bevor sie in den Körper , wenn und nur ersetzen , wenn Der Body wendet kein # oder ## auf das Argument an. C99 ist in dieser Hinsicht unverändert gegenüber C89.
quelle