C ++ Präprozessor-Makroschleife __VA_ARGS__ 1 vs 2+ Argumente

8

Ich verwende die Makros aus diesem Post durchläuft meine Argumente. Alles funktioniert super! Gibt es jedoch eine Möglichkeit, diese beiden CCB_CREATE und CCB_CREATE_MORE zu kombinieren?

Ich muss das erste Argument object_type extrahieren, um zusätzlichen Code zu schreiben. Die zusätzliche object_type s verwendet die FOR_EACH -Schleife, um sie in die Map einzufügen.

Der Compiler reklamiert, wenn ich bei Verwendung von CCB_CREATE_MORE(Type1) nur ein Argument habe. Um das zu beheben, habe ich ein anderes Makro erstellt, das mit CCB_CREATE(Type1) umgehen kann. Ich hoffe, eine clevere Lösung zu finden, diese beiden zu einem eleganten Makro zu kombinieren. Irgendwelche Ideen?

%Vor%     
docchang 18.10.2013, 02:48
quelle

2 Antworten

5

Der Compiler beschwert sich wahrscheinlich über das nachgestellte Komma, wenn die variadische Argumentliste leer ist. GCC- und Visual Studio-Compiler unterstützen die nicht standardmäßige Erweiterung ##__VA_ARGS__ , um das nachfolgende Komma zu unterdrücken:

%Vor%

Die Visual Studio-Compiler unterdrücken das abschließende Komma auch ohne die Erweiterung ## .

Siehe GCC-Dokumentation hier und Visual Studio-Dokumentation hier .

Wenn Sie eine standardkonforme Lösung benötigen, finden Sie eine ausführlichere Antwort auf diese Frage .

Wenn Sie also entweder gcc oder Visual Studio verwenden, sollten Sie Ihr ursprüngliches Makro mit dieser einfachen Änderung verwenden können:

%Vor%

Bearbeiten: Sie müssten auch die Erweiterung ##__VA_ARGS__ im Makro FOR_EACH() oder die elegantere von ugoren vorgeschlagene Modifikation verwenden.

%Vor%     
Chris Olsen 20.10.2013, 07:26
quelle
2

Zusätzlich zu Chris Olsens Vorschlag wird eine geringfügige Änderung am Makro FOR_EACH benötigt:

%Vor%

Als Ergebnis wird FOR_EACH(X, a) X(a) (anstelle von X(a); X(); ). Dies eliminiert einen leeren INSERT_LOADER_MAP Aufruf.

    
ugoren 20.10.2013 08:22
quelle

Tags und Links