Heim >Backend-Entwicklung >C++ >Wie kann ich mit Kommas in Makroargumenten in C/C umgehen?

Wie kann ich mit Kommas in Makroargumenten in C/C umgehen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-17 06:29:25995Durchsuche

How Can I Handle Commas in Macro Arguments in C/C  ?

Kommas innerhalb von Makros in C/C

Bei der Verwendung von Makros, die mehrere Argumente akzeptieren, können Schwierigkeiten auftreten, insbesondere wenn die Argumente Kommas enthalten. Betrachten Sie das folgende Beispiel:

#define FOO(type, name) type name

Während es einfach ist, das Makro mit Argumenten wie den folgenden zu verwenden:

FOO(int, int_var);

Es treten Probleme auf, wenn mit komplexen Argumenten mit Kommas umgegangen wird, wie zum Beispiel:

FOO(std::map<int, int>, map_var); // Error: 3 arguments passed to macro 'FOO', which takes only 2

Um dieses Problem zu beheben, könnte man eine benutzerdefinierte Typdefinition einführen:

typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var); // Compiles successfully

Dies jedoch Dem Ansatz mangelt es an Ergonomie und er erfordert zusätzliche Typkonvertierungen.

Eine alternative Lösung besteht darin, ein Makro mit dem Namen COMMA zu definieren:

#define COMMA ,

Mit dieser Definition können komplexe Argumente mithilfe des COMMA-Makros an das Makro übergeben werden , zum Beispiel:

FOO(std::map<int COMMA int>, map_var);

Diese Methode ermöglicht auch die Stringifizierung von Argumenten, wie im Folgenden dargestellt Code:

#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 hat den Typ-ID-Namen „St3mapIiiSt4lessIiESaISt4pairIKiiEEE“.“

Das obige ist der detaillierte Inhalt vonWie kann ich mit Kommas in Makroargumenten in C/C umgehen?. 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