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?
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:
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.
Zusätzlich zu Chris Olsens Vorschlag wird eine geringfügige Änderung am Makro FOR_EACH
benötigt:
Als Ergebnis wird FOR_EACH(X, a)
X(a)
(anstelle von X(a); X();
). Dies eliminiert einen leeren INSERT_LOADER_MAP
Aufruf.