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
}
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
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