Komma in C/C-Makros: Eine Lösung für mehrere Makroargumente
Makros in C/C bieten eine praktische Möglichkeit, einen Präprozessor zu erweitern Direktive in einen Codeblock. Wenn Makros jedoch mehrere Argumente akzeptieren, kann der Umgang mit Kommas zu einer Herausforderung werden.
Betrachten Sie das Beispielmakro:
#define FOO(type,name) type name
Dieses Makro erwartet zwei Argumente: einen Typ und einen Namen. Die Verwendung ist in einfachen Fällen unkompliziert:
FOO(int, int_var);
Aber wenn der Typ komplexer ist, wie etwa eine Vorlage oder ein Container, kann die Übergabe von Kommas zu Fehlern führen:
FOO(std::map<int, int>, map_var); // error
Eins Die Lösung besteht darin, einen Typalias zu definieren, um die Notwendigkeit von Kommas zu beseitigen:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var);
Dieser Ansatz kann jedoch umständlich sein und Typkompatibilität einführen Probleme.
Eine alternative Lösung besteht darin, ein Komma-Makro zu verwenden, um die Kommas innerhalb der Makrodefinition selbst zu verarbeiten:
#define COMMA , FOO(std::map<int COMMA int>, map_var);
Dies definiert ein Komma-Makro, das zwischen Argumenten platziert werden kann, um die zu verarbeiten Kommatrennung. Diese Methode bietet eine sauberere und einfachere Möglichkeit, komplexe Typen an ein Makro zu übergeben:
#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 die Typinformationen für std::map
std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
Die Verwendung eines Komma-Makros ermöglicht mehr Flexibilität und eine sauberere Syntax bei der Arbeit mit Makros, die mehrere Argumente akzeptieren.
Das obige ist der detaillierte Inhalt vonWie kann ich Kommas in C/C-Makros mit mehreren Argumenten verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!