Heim >Backend-Entwicklung >C++ >Warum erzeugt die Stringifizierung in einem Fall „foo' und in einem anderen „4'?

Warum erzeugt die Stringifizierung in einem Fall „foo' und in einem anderen „4'?

Linda Hamilton
Linda HamiltonOriginal
2024-12-24 04:20:10904Durchsuche

Why Does Stringification Produce

Stringification Unraveled: Eine Schritt-für-Schritt-Erklärung

Stringification ist eine leistungsstarke Makrotechnik, die ein gegebenes Token in ein String-Literal umwandelt. Um seine Feinheiten zu verstehen, untersuchen wir das folgende Szenario:

define foo 4

define str(s) #s

Mit str(foo) ist die erwartete Ausgabe „ foo“, da angenommen wird, dass die Stringifizierung vor der Texterweiterung erfolgt. Im zweiten Beispiel gilt jedoch:

define xstr(s) str(s)

define str(s) #s

define foo 4

Die Ausgabe von xstr(foo) wird zu „4“. Um diese Diskrepanz aufzudecken, befassen wir uns mit den spezifischen Schritten der Makroerweiterung:

  1. Vorverarbeitungsanweisungen:Makros, die mit # oder ## beginnen, werden zuerst verarbeitet.
  2. Argumentersetzung: Argumente innerhalb von Makros werden durch entsprechende ersetzt Werte.
  3. Parameterersetzung: Parameter werden durch ihre jeweiligen Argumentwerte ersetzt.
  4. Erneutes Scannen nach Makros: Der resultierende Text wird erneut nach zusätzlichen Makros durchsucht .

Anwenden dieser Schritte auf xstr(foo):

  1. Es passiert nichts, da str(s) kein # oder ## enthält.
  2. foo wird durch 4 ersetzt, was zu xstr(4) führt.
  3. Innerhalb von str(s) wird s durch 4 ersetzt, wodurch str(4) generiert wird.
  4. str(4) wird erneut gescannt und erzeugt die endgültige Ausgabe von „4.“

Nun untersuchen wir str(foo):

  1. Das Argument foo ist immer noch foo (nicht durch 4 ersetzt).
  2. Der Ersetzungstext #s erzeugt „foo“.

Der Kern des Problems liegt in der Reihenfolge der Ausführung. In Schritt 1 wurde bei der Auswertung von str(foo) foo noch nicht durch 4 ersetzt. Daher ergibt der Stringifizierungsschritt „foo“.

Daher ist die Verwendung eines Hilfsmakros wie xstr möglich separate Ausführung der Schritte 2 und 1, um letztendlich das gewünschte Stringifizierungsverhalten bereitzustellen.

Das obige ist der detaillierte Inhalt vonWarum erzeugt die Stringifizierung in einem Fall „foo' und in einem anderen „4'?. 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