Fehler: Einfügen von “.” und “rot” ergibt kein gültiges Vorverarbeitungstoken

Lesezeit: 2 Minuten

Jacks Benutzeravatar
Jack

Ich implementiere das X-Makro, habe aber ein Problem mit einer einfachen Makroerweiterung. Dieses Makro (siehe unten) wird in mehreren Verwendungsbeispielen für Makros verwendet, indem es in this Artikel. Der Compiler gibt eine Fehlermeldung aus, aber ich kann gültigen C-Code sehen, indem ich verwende -E Flag mit dem GCC-Compiler.

Die Makro-X-Liste ist wie folgt definiert:

#define LIST \
  X(red, "red") \
  X(blue, "blue") \
  X(yellow, "yellow")

Und dann:

#define X(a, b) foo.##a = -1;
  LIST;
#undef X

Aber der gcc gab folgende Fehlermeldungen aus:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token

Wie gesagt, ich kann gültigen C-Code sehen, indem ich verwende -E gcc einschalten:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
  foo.red = -1; foo.blue = -1; foo.yellow = -1;;

Was ist ein gültiges Vorverarbeitungstoken? Kann das jemand erklären?

(Bevor Sie sagen “Warum nicht einfach entweder initialisieren oder memset()?” Es ist nicht mein richtiger Code.)

. trennt Token und kann daher nicht verwendet werden ## wie .red ist kein gültiges Token. Sie würden nur verwenden ## wenn Sie zwei Token zu einem einzigen verketten würden.

Das funktioniert:

#define X(a, b) foo.a = -1;

Was ist ein gültiges Verarbeitungstoken? Kann das jemand erklären?

Es ist, was geparst/lexed wird. foo.bar würde als 3 Token (zwei Bezeichner und ein Operator) geparst werden: foo . bar Wenn du benutzt ## Sie würden nur 2 Token erhalten (eine Kennung und ein ungültiges Token): foo .bar

  • So ist der Abschnitt “Token einfügen” in Dieser Artikel ist einfach falsch?

    – Michael

    24. Juni 2014 um 7:53 Uhr

  • @QuentinUK Wusste nicht, dass es in Visual Studio funktionieren würde. Vielleicht entsprechen einige von ihnen nicht dem strengen C-Standard.

    – Jack

    2. Februar 2017 um 19:21 Uhr


  • @QuentinUK Es gibt nur eine Definition dafür, was richtig und falsch ist (das ist buchstäblich der Zweck eines Standards), aber manchmal ist ein Programmierer nicht der einzige Teil der Toolchain, der die Kriterien des Falschen erfüllt;)

    – Leichtigkeitsrennen im Orbit

    19. Juli 2019 um 16:31 Uhr

1409320cookie-checkFehler: Einfügen von “.” und “rot” ergibt kein gültiges Vorverarbeitungstoken

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy