2010-08-25 11 views
7

Betrachten Sie dieses Makro:Variadische Makros mit null Argumente und Komma

#define MAKE_TEMPLATE(...) template <typename T, __VA_ARGS__ > 

Wenn mit Null Argumente verwendet wird, erzeugt es schlecht Code, da der Compiler eine Kennung nach dem Komma erwartet. Tatsächlich ist der Vorprozessor von VC klug genug, um das Komma zu entfernen, aber GCCs nicht. Da Makros kann nicht überlastet werden, scheint es, wie es ein separates Makro für diesen speziellen Fall nimmt es richtig zu machen, wie in:

#define MAKE_TEMPLATE_Z() template <typename T> 

Gibt es eine Möglichkeit, es ohne zu machen arbeiten, um das zweite Makro einzuführen?

Antwort

9

Nein, weil der Makroaufruf MAKE_TEMPLATE() überhaupt keine Argumente hat; Es hat ein Argument mit null Token.

Ältere Präprozessoren, die anscheinend GCC zu der Zeit enthielten, als diese Antwort ursprünglich geschrieben wurde, interpretierten manchmal eine leere Argumentliste wie Sie hoffen, aber der Konsens hat sich in Richtung einer strengeren, engeren Erweiterung entwickelt, die dem Standard besser entspricht.

Um die Antwort unten zu arbeiten, definieren einen zusätzlichen Makroparameter vor dem Auslassungszeichen zu erhalten:

#define MAKE_TEMPLATE(UNUSED, ...) template <typename T, ## __VA_ARGS__ > 

und setzen Sie dann immer ein Komma vor dem ersten Argument, wenn die Liste nicht leer ist:

MAKE_TEMPLATE(, foo) 

Alte Antwort

Nach http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html unterstützt GCC dies, nur nicht transparent.

Syntax ist:

#define MAKE_TEMPLATE(...) template <typename T, ## __VA_ARGS__ > 

Wie dem auch sei, die beide auch variadische Vorlagen in C++ 0x-Modus unterstützen, die bei weitem vorzuziehen ist.

+0

Danke. Übrigens, ist das Standardverhalten oder ein Gcc-Ding? – uj2

+1

@ uj2: Es ist GCC; Der Standard verbietet einfach leere Varianzeigen. Übrigens vermischt das C99 mit C++, daher ist dieser Code strikt nicht-Standard, es sei denn, Sie sind in C++ 0x ... in diesem Fall sollten Sie ... – Potatoswatter

+0

Haben Sie nichts dagegen, die Vorlage, es ist nur ein Spielzeug-Beispiel. Wie ist das notwendig 0x, definiert C++ 98/03 variadic Makros nicht? – uj2

1

Bei GCC müssen Sie es so schreiben: der

#define MAKE_TEMPLATE(...) template <typename T, ##__VA_ARGS__ > 

Wenn __VA_ARGS__ leer ist, GCC Präprozessor Komma vorhergehenden entfernt werden.

0

Zunächst einmal darauf achten, dass Variadic-Makros nicht Teil des aktuellen C++ sind. Es scheint, dass sie in der nächsten Version sein werden. Im Moment stimmen sie nur überein, wenn Sie in C99 programmieren.

Ab Variadic-Makros mit Nullargumenten gibt es Tricks à la Boost, um dies zu erkennen und um es herum zu programmieren. Googel für empty macro arguments.

Verwandte Themen