Heim > Backend-Entwicklung > C++ > Warum gibt „xstr(foo)' in der C-ähnlichen Makroerweiterung „4' aus, während „str(foo)' „foo' ausgibt?

Warum gibt „xstr(foo)' in der C-ähnlichen Makroerweiterung „4' aus, während „str(foo)' „foo' ausgibt?

Linda Hamilton
Freigeben: 2024-12-28 14:30:11
Original
207 Leute haben es durchsucht

Why Does `xstr(foo)` Output

Stringifizierung verstehen: Die wichtigsten Schritte der Makroerweiterung

Das Konzept der Stringifizierung in C-ähnlichen Sprachen ermöglicht es Ihnen, Ausdrücke in Zeichenfolgen umzuwandeln. Das Verständnis der an diesem Prozess beteiligten Schritte ist für eine effektive Makronutzung von entscheidender Bedeutung.

Das Problem: Unterschiede in der Ausgabe

Bedenken Sie die folgende Makrodefinition:

#define foo 4
#define str(s) #s
Nach dem Login kopieren

Wenn Sie str(foo) in Ihrem Code verwenden, wird „foo“ ausgegeben, da die Stringifizierung (Schritt 1) ​​vor der Texterweiterung (Schritt) durchgeführt wird 2).

Wenn Sie jedoch ein zusätzliches Makro definieren:

#define xstr(s) str(s)
Nach dem Login kopieren

Und xstr(foo) verwenden, wird die Ausgabe überraschenderweise „4“ sein. Dieser Unterschied erfordert eine Untersuchung des Stringifizierungsprozesses.

Schritte der Makroerweiterung

Der Prozess der Makroerweiterung umfasst mehrere Schritte gemäß C- und C-Standards:

  1. Vorverarbeitung: Token mit vorangestelltem # oder ## sind verarbeitet.
  2. Argumentersetzung: Makros werden auf jedes Argument angewendet.
  3. Parameterersetzung: Parameter werden durch die entsprechenden Makroergebnisse ersetzt.
  4. Erneutes Scannen: Der Code wird erneut für weitere Makros gescannt Erweiterung.

Anwenden der Schritte auf xstr(foo)

  1. Vorverarbeitung: Keine anwendbaren Token.
  2. Argumentersatz: foo wird durch ersetzt 4.
  3. Parameterersetzung: In str(s) wird s durch 4 ersetzt, wodurch str(4) entsteht.
  4. Erneutes Scannen: str (4) wird erneut gescannt, was zur Ausgabe „4“ führt.

Warum str(foo) Gibt „foo“ aus

Im Gegensatz zu xstr(foo) liefert str(foo) „foo“, weil:

  • Vorverarbeitung: Keine Stringifizierung Token vorhanden.
  • Argumentersetzung:Keine anwendbar.
  • Parameterersetzung: #foo bleibt unverändert, da foo nicht durch 4 ersetzt wurde.
  • Erneutes Scannen: #foo wird nicht erneut gescannt , wodurch „foo“ entsteht.

Daher wird die Verwendung eines Hilfsmakros wie xstr sichergestellt Die Texterweiterung (Schritt 2) wird vor der Stringifizierung (Schritt 1) ​​durchgeführt, um korrekte String-Konvertierungen zu ermöglichen.

Das obige ist der detaillierte Inhalt vonWarum gibt „xstr(foo)' in der C-ähnlichen Makroerweiterung „4' aus, während „str(foo)' „foo' ausgibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage