Heim >Backend-Entwicklung >C++ >Wie wirkt sich die Reihenfolge der Makroerweiterung auf die Stringifizierung in C und C aus?
Im Bereich C und C bezieht sich der Begriff „Stringifizierung“ auf die Umwandlung eines Makroarguments in ein String-Literal . Der Prozess kann jedoch kompliziert sein, wie das folgende Szenario zeigt:
#define foo 4 #define str(s) #s
In diesem Fall gibt str(foo) „foo“ aus, da der Stringifizierungsprozess (der #-Operator) vor dem Makro ausgeführt wird Erweiterung (die #define-Direktive). Dadurch wird sichergestellt, dass foo ein Makroname bleibt und nicht durch seinen Wert ersetzt wird.
Der folgende Codeausschnitt erzeugt jedoch ein anderes Ergebnis:
#define xstr(s) str(s) #define str(s) #s #define foo 4
Beim Aufruf von xstr(foo) wird der Die Ausgabe wird zu „4“. Um dieses Verhalten zu verstehen, müssen wir uns mit den Feinheiten der Makroexpansion befassen.
Gemäß den C- und C-Standards umfasst der Makroexpansionsprozess die folgenden Schritte:
Im Fall von xstr(foo) :
Der Hauptunterschied liegt hier im Schritt, in dem Makroargumente ersetzt werden (Schritt 2). Bei str(foo) im ersten Beispiel erfolgt Schritt 2, nachdem die Stringifizierung in Schritt 1 angewendet wurde. Daher wird foo nicht ersetzt und die Ausgabe bleibt „foo“.
Um dieses Problem zu beheben, wird der Hilfsmakro xstr wird verwendet. Durch das Verschachteln von Makros können wir zunächst die Argumentersetzung in Schritt 2 durchführen und dann in Schritt 1 die Stringifizierung anwenden, um sicherzustellen, dass das gewünschte Ergebnis „4“ erhalten wird.
Das obige ist der detaillierte Inhalt vonWie wirkt sich die Reihenfolge der Makroerweiterung auf die Stringifizierung in C und C aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!