Komma in C/C-Makros
In C/C-Makros ist es oft notwendig, mehrere Argumente durch Kommas zu trennen. Allerdings treten Probleme auf, wenn das Makro eine bestimmte Anzahl von Argumenten erwartet und die Angabe von mehr oder weniger zu Fehlern führt.
Problemszenario
Stellen Sie sich ein Makro vor, das wie folgt definiert ist:
#define FOO(type, name) type name
Während dieses Makro einfach verwendet werden kann, z. B.:
FOO(int, int_var);
Es wird problematisch, wenn komplexe Typen beteiligt sind:
FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
Traditionelle Lösung
Ein gängiger Ansatz besteht darin, einen neuen Typalias zu erstellen und ihn im Makro zu verwenden:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // OK
Makrobasierte Lösung
Alternativ Sie kann ein Makro definieren, das ein Komma darstellt:
#define COMMA ,
Mit diesem Makro können Sie jetzt komplexe Typen fehlerfrei übergeben:
FOO(std::map<int COMMA int>, map_var);
Zusätzlicher Anwendungsfall
Dieser Ansatz erweist sich auch bei der Stringifizierung von Makroargumenten als nützlich, wie unten dargestellt:
#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 wird print:
std::map
Das obige ist der detaillierte Inhalt vonWie kann ich mit Kommas in komplexen C/C-Makroargumenten umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!