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

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

Linda Hamilton
Linda HamiltonOriginal
2024-12-11 06:45:09876Durchsuche

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

Komma in C/C-Makros

In C/C-Makros ist es oft notwendig, mehrere Argumente durch Kommas zu trennen. Allerdings treten Probleme auf, wenn das Makro eine bestimmte Anzahl von Argumenten erwartet und die Angabe von mehr oder weniger zu Fehlern führt.

Problemszenario

Stellen Sie sich ein Makro vor, das wie folgt definiert ist:

#define FOO(type, name) type name

Während dieses Makro einfach verwendet werden kann, z. B.:

FOO(int, int_var);

Es wird problematisch, wenn komplexe Typen beteiligt sind:

FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2

Traditionelle Lösung

Ein gängiger Ansatz besteht darin, einen neuen Typalias zu erstellen und ihn im Makro zu verwenden:

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

Makrobasierte Lösung

Alternativ Sie kann ein Makro definieren, das ein Komma darstellt:

#define COMMA ,

Mit diesem Makro können Sie jetzt komplexe Typen fehlerfrei übergeben:

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

Zusätzlicher Anwendungsfall

Dieser Ansatz erweist sich auch bei der Stringifizierung von Makroargumenten als nützlich, wie unten dargestellt:

#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 wird print:
std::map hat den Typ-ID-Namen „St3mapIiiSt4lessIiESaISt4pairIKiiEEE“

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