Token-Pasting

15/02/2010 - 16:58 von Jan Schmidt | Report spam
Hallo NG,

warum funktioniert folgender Code nicht (mehr)?

#include <stdio.h>

#define CONV(x,name,wert)\
x##define name wert

CONV(#,EINS,1)

int main (void)
{
printf ("%d", EINS);
return 0;
}

Eigentlich sollte CONV(#,EINS,1) vom Pràprozessor durch
#define EINS 1 ersetzt werden.

Der gcc meckert: error: pasting "#" and "define" does not give a valid
preprocessing token

(Hintergrund dieses Konstruktes: in manchen Übersetzungen kommt eine
andere Implementierung zum Einsatz:

#define CONV(x,name,wert) \
const int name = wert;
)

Muss man dem Pràprozessor rekursives Arbeiten extra einschalten?

Danke für die Erleuchtung,
jan
 

Lesen sie die antworten

#1 Alexander Bartolich
15/02/2010 - 17:56 | Warnen spam
Jan Schmidt schrieb:
warum funktioniert folgender Code nicht (mehr)?
[...]
Der gcc meckert: error: pasting "#" and "define" does not give a valid
preprocessing token



Nun, da hat der gcc einfach recht.
Mit welchen Compilern funktioniert das ganze denn überhaupt?

(Hintergrund dieses Konstruktes: in manchen Übersetzungen kommt eine
andere Implementierung zum Einsatz:

#define CONV(x,name,wert) \
const int name = wert;
)



Also ich verwende für solche Zwecke (Ganzzahlkonstante, die garantiert
inline verwendet werden soll) eine enum-Deklaration. Für deine Zwecke
adaptiert:

#define CONV(x,name,wert) \
enum { name = wert };

Muss man dem Pràprozessor rekursives Arbeiten extra einschalten?



Dein Hack ist zwar cool, aber nicht durch den Standard gedeckt. Mög-
licherweise bieten manche Implementierungen eine Möglichkeit, einen
"erweiterten" Sprachumfang zu verarbeiten. Aber diese Möglichkeit ist
dann bestimmt nicht Teil des Standards.

Lass die Leute reden und làchle einfach mild,
Die meisten Leute haben ihre Bildung aus der Bild.
Und die besteht nun mal, wer wüsste das nicht,
aus: Angst, Hass, Titten und dem Wetterbericht!

Ähnliche fragen