2016-11-18 5 views
3

Im folgenden Code wird CHOOSE_MACRO zwischen zwei Makros auswählen soll, die ihn übergeben werden, auf der Grundlage der Anzahl der Argumente: FOO() zu RESULT0 erweitern sollte, und FOO(x) zu RESULT1 erweitern sollte.Die Übergabe von 0 Argumenten an variadic Makro scheitert in GCC, aber nur in C++?

Dies funktioniert mit Clang für C (http://rextester.com/LRX65441) und C++ (http://rextester.com/FYC46680).

In GCC, funktioniert es für C-Code (http://rextester.com/VWAPR56841), aber in C++ Code beiden Beschwörungen produzieren RESULT1 (http://rextester.com/ZNEKAV71986).

Was passiert und wie kann ich das plattformübergreifend umsetzen?

#define CHOOSE_MACRO(_0, _1, NAME, ...) NAME 
#define FOO(...) CHOOSE_MACRO(~~, ##__VA_ARGS__, RESULT1, RESULT0) 

void foo() 
{ 
    FOO(); // should produce RESULT0 - actually produces RESULT1 for gcc -x c++ 
} 

void bar() 
{ 
    FOO(x); // should produce RESULT1 
} 
+0

Es scheint mir, dass die Standards ist omisse über diese ('## __ VA_ARGS__') Konstruktion, so g ++ implementieren es als Erweiterung. Übergeben Sie die Option "-std = gnu ++ 14", um Ihre Ergebnisse zu erhalten. Siehe hier: [wandbox] (http://melpon.org/wandbox/permlink/ewx9GqHCrLnwpvp9) – Amadeus

+0

Sicher ist es eine Erweiterung, aber angeblich unterstützen beide diese Compiler es, also versuche ich nur zu verstehen, warum es nicht funktioniert. Es ist möglich (obwohl nervig), auch zu arbeiten. – jtbandes

Antwort

0

Ich denke, Sie sind einfach falsch. Ich habe Ihren Code ein wenig verbessert und es auf vielen verschiedenen C++ - Compilern getestet, und es funktioniert jedes Mal so, wie Sie es wollen.

Siehe hier: https://godbolt.org/g/D6rgxS

+0

Interessant. Das Hinzufügen von '-std = C++ 0x' ändert das Ergebnis. Ich nehme an, der Standard ist 'gnu ++ 0x'. – jtbandes

Verwandte Themen