Heim >Backend-Entwicklung >C++ >Wie wirkt sich die Reihenfolge der Makroerweiterung auf die Stringifizierung in C und C aus?

Wie wirkt sich die Reihenfolge der Makroerweiterung auf die Stringifizierung in C und C aus?

Barbara Streisand
Barbara StreisandOriginal
2024-12-25 17:24:10457Durchsuche

How Does Macro Expansion Order Affect Stringification in C and C  ?

Stringifizierung: Den Makro-Erweiterungsprozess verstehen

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:

  1. Identifizieren und verarbeiten Token mit vorangestelltem # oder ## (der Stringifizierungsoperator).
  2. Ersetzen Sie jedes Makro durch die entsprechenden Makrodefinitionen Argumente.
  3. Ersetzen Sie jeden Funktionsparameter durch das Ergebnis der Makroersetzung.
  4. Scannen Sie den Code erneut nach zusätzlichen Makros.

Im Fall von xstr(foo) :

  1. Das xstr-Makro erfordert keine Stringifizierung (Schritt 1).
  2. foo wird durch ersetzt sein Wert ist 4 (Schritt 2).
  3. Im str-Makro wird s durch 4 ersetzt, was zu str(4) führt (Schritt 3).
  4. str(4) wird erneut gescannt, ergibt „4“ (letzter Schritt).

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn