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
Freigeben: 2024-12-11 16:19:20
Original
318 Leute haben es durchsucht

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
Nach dem Login kopieren

Mit diesem Makro kann eine Variable eines bestimmten Typs deklariert werden , zum Beispiel:

FOO(int, int_var);
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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);
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

Dieser Code gibt Folgendes aus:

std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage