Ich habe gerade herausgefunden, dass gcc das Ergebnis der Erweiterung eines funktionsähnlichen Makros als separates Token zu behandeln scheint. Hier ist ein einfaches Beispiel, das Verhalten von gcc zeigt:Erweiterung des funktionsähnlichen Makros erstellt ein separates Token
#define f() foo
void f()_bar(void);
void f()bar(void);
void f()-bar(void);
Wenn ich ausführen gcc -E -P test.c
(läuft nur den Präprozessor), habe ich folgende Ausgabe:
void foo _bar(void);
void foo bar(void);
void foo-bar(void);
Es scheint, wie in den ersten beiden Definitionen, gcc fügt Leerzeichen nach dem erweiterten Makro ein, um sicherzustellen, dass es sich um ein separates Token handelt. Ist das wirklich was hier passiert?
Ist dies von irgendeinem Standard vorgeschrieben (Ich konnte keine Dokumentation zu diesem Thema finden)?
Ich möchte _bar
Teil des gleichen Tokens machen. Gibt es eine Möglichkeit, dies zu tun? Ich könnte den Token-Verkettungsoperator ##
verwenden, aber es wird mehrere Ebenen von Makros erfordern (da im realen Code f() komplexer ist). Ich habe mich gefragt, ob es eine einfache (und wahrscheinlich besser lesbare) Lösung gibt.
Ist Google down? Hast du nicht einmal versucht, den C [Standard] (http://port70.net/~nsz/c/c11/n1570.html#6.10.3) zu finden, der ** offensichtlich ** die maßgebliche Quelle ist, zu der man sich beraten kann. – Olaf
@Olaf - Ich habe weder in C99 noch auf dem Link, auf den Sie mich hingewiesen haben, eine explizite Antwort auf meine Frage gefunden. – martinkunev
Um fair zu sein, ist das Verhalten, wie in der Norm beschrieben, nicht ganz offensichtlich. Ich vermute, das Schlüsselwort ist, dass der Präprozessor das Makro durch * Token * ersetzt, was bedeutet, dass Whitespace eingefügt wird, wo es nötig ist, um dies tatsächlich zu tun. – nemetroid