In C/C werden Makros oft verwendet, um Code zu vereinfachen und zu verallgemeinern. Wenn Makros jedoch mehrere Argumente annehmen, kann es schwierig sein, Kommas korrekt zu verarbeiten.
Betrachten Sie das folgende Makro:
#define FOO(type, name) type name
Mit diesem Makro kann eine Variable eines bestimmten Typs deklariert werden , zum Beispiel:
FOO(int, int_var);
Wenn der Typ jedoch Kommas enthält, beispielsweise in einem Vorlagenparameter, schlägt das Makro fehl. Zum Beispiel:
FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
Um dieses Problem zu beheben, besteht eine Möglichkeit darin, eine Typdefinition einzuführen:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // OK
Dieser Ansatz funktioniert zwar, kann aber umständlich sein und zu Typkompatibilitätsproblemen führen.
Eine alternative Lösung ist die Verwendung des COMMA-Makros des Präprozessors:
#define COMMA , FOO(std::map<int COMMA int>, map_var);
Dadurch können Kommas gesetzt werden in Makroargumente eingefügt werden, ohne Fehler zu verursachen. Darüber hinaus kann es zum Zusammenfügen von Makroargumenten in Zeichenfolgen verwendet werden:
#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<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
Durch die Verwendung des COMMA-Makros können Entwickler Typedefs vermeiden und sicherstellen, dass Kommas vorhanden sind in Makros korrekt behandelt.
Das obige ist der detaillierte Inhalt vonWie kann ich Kommas in C/C-Makros mit mehreren Argumenten richtig verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!