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
Freigeben: 2024-12-11 06:45:09
Original
761 Leute haben es durchsucht

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

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

FOO(int, int_var);
Nach dem Login kopieren

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

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

Makrobasierte Lösung

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

#define COMMA ,
Nach dem Login kopieren

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

FOO(std::map<int COMMA int>, map_var);
Nach dem Login kopieren

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

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!

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