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

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

Patricia Arquette
Freigeben: 2024-12-04 20:59:13
Original
777 Leute haben es durchsucht

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

Komma in C/C-Makros: Eine Lösung für mehrere Makroargumente

Makros in C/C bieten eine praktische Möglichkeit, einen Präprozessor zu erweitern Direktive in einen Codeblock. Wenn Makros jedoch mehrere Argumente akzeptieren, kann der Umgang mit Kommas zu einer Herausforderung werden.

Betrachten Sie das Beispielmakro:

#define FOO(type,name) type name
Nach dem Login kopieren

Dieses Makro erwartet zwei Argumente: einen Typ und einen Namen. Die Verwendung ist in einfachen Fällen unkompliziert:

FOO(int, int_var);
Nach dem Login kopieren

Aber wenn der Typ komplexer ist, wie etwa eine Vorlage oder ein Container, kann die Übergabe von Kommas zu Fehlern führen:

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

Eins Die Lösung besteht darin, einen Typalias zu definieren, um die Notwendigkeit von Kommas zu beseitigen:

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

Dieser Ansatz kann jedoch umständlich sein und Typkompatibilität einführen Probleme.

Eine alternative Lösung besteht darin, ein Komma-Makro zu verwenden, um die Kommas innerhalb der Makrodefinition selbst zu verarbeiten:

#define COMMA ,

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

Dies definiert ein Komma-Makro, das zwischen Argumenten platziert werden kann, um die zu verarbeiten Kommatrennung. Diese Methode bietet eine sauberere und einfachere Möglichkeit, komplexe Typen an ein Makro zu übergeben:

#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 die Typinformationen für std::map:

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

Die Verwendung eines Komma-Makros ermöglicht mehr Flexibilität und eine sauberere Syntax bei der Arbeit mit Makros, die mehrere Argumente akzeptieren.

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