Bei der Verwendung von Makros, die mehrere Argumente akzeptieren, können Schwierigkeiten auftreten, insbesondere wenn die Argumente Kommas enthalten. Betrachten Sie das folgende Beispiel:
#define FOO(type, name) type name
Während es einfach ist, das Makro mit Argumenten wie den folgenden zu verwenden:
FOO(int, int_var);
Es treten Probleme auf, wenn mit komplexen Argumenten mit Kommas umgegangen wird, wie zum Beispiel:
FOO(std::map<int, int>, map_var); // Error: 3 arguments passed to macro 'FOO', which takes only 2
Um dieses Problem zu beheben, könnte man eine benutzerdefinierte Typdefinition einführen:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // Compiles successfully
Dies jedoch Dem Ansatz mangelt es an Ergonomie und er erfordert zusätzliche Typkonvertierungen.
Eine alternative Lösung besteht darin, ein Makro mit dem Namen COMMA zu definieren:
#define COMMA ,
Mit dieser Definition können komplexe Argumente mithilfe des COMMA-Makros an das Makro übergeben werden , zum Beispiel:
FOO(std::map<int COMMA int>, map_var);
Diese Methode ermöglicht auch die Stringifizierung von Argumenten, wie im Folgenden dargestellt Code:
#include <cstdio> #include <map> #include <typeinfo> #define STRV(...) #__VA_ARGS__ #define COMMA , #define FOO(type, bar) bar(STRV(type) \ " has typeid name \"%s\"", typeid(type).name()) int main() { FOO(std::map<int COMMA int>, std::printf); }
Dieser Code gibt Folgendes aus: „std::map
Das obige ist der detaillierte Inhalt vonWie kann ich mit Kommas in Makroargumenten in C/C umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!