Heim >Backend-Entwicklung >C++ >Wie kann ich Kommas in C/C-Makros mit mehreren Argumenten richtig verarbeiten?

Wie kann ich Kommas in C/C-Makros mit mehreren Argumenten richtig verarbeiten?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-11 16:19:20331Durchsuche

How Can I Handle Commas Correctly in C/C   Macros with Multiple Arguments?

Makros und Kommas in C/C

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn