Ich versuche, ein Makro zu erstellen, das über eine definierte Liste von Begriffen iterieren und für jeden einen anderen Makro möglicherweise mit zusätzlicher Argumentliste aufrufen würde. Hier ist, was ich habe:Ungültige Anzahl von Argumenten in einem Variadic-Makro
#define ITERATE_OVER_TERMS(MACRO, ...) \
MACRO(Term1, __VA_ARGS__) \
MACRO(Term2, __VA_ARGS__) \
MACRO(Term3, __VA_ARGS__) \
... and so on
Allerdings, wenn ich versuche, es zu benutzen, die mit Visual Studio 2015, erhalte ich einen Fehler
warning C4003: not enough actual parameters for macro 'BODY'
wo BODY
ist der Name des Makros als die übergebene MACRO
Argument. Obwohl es technisch eine Warnung ist, zeigt es, dass etwas mit der Erweiterung nicht stimmt.
In einem Versuch, den Fehler zu verengen, reduzierte ich mein Beispiel auf die folgende:
#include <iostream>
#define ITERATE(MACRO, ...) \
MACRO(1, __VA_ARGS__) MACRO(2, __VA_ARGS__)
#define BODY(IterationArg, Arg1, Arg2) \
std::cout << IterationArg << Arg1 << Arg2 << std::endl;
int main() {
ITERATE(BODY, 8, 9)
return 0;
}
Es mir den Fehler gibt, wie oben gezeigt, während ich es erwartete erfolgreich zu kompilieren und die Ausgabe
produzieren189
289
Es scheint mit g ++, aber nicht mit Visual Studio zu kompilieren. Was fehlt mir? Gibt es einen Umweg, damit das funktioniert?
Visual Studio 2015 hat noch eine teilweise Unterstützung für C99-Präprozessor. Quelle: https://msdn.microsoft.com/en-us/library/hh567368.aspx – KABoissonneault
@KABoissonneault Sie scheinen variadic Makros für eine lange Zeit zu unterstützen (https://msdn.microsoft.com/en-us/library /ms177415.aspx) Es gibt bereits Versionen für VS2005. – CygnusX1
Sie unterstützen Variadic-Makros, aber um ehrlich zu sein habe ich noch nie ein Makro als Makro-Argument übergeben. Visual Studio erwartet wahrscheinlich, dass Sie 'BODY' direkt im' main'-Körper auswerten. – KABoissonneault