Maison > développement back-end > C++ > Comment puis-je gérer les virgules dans les arguments de macro en C/C ?

Comment puis-je gérer les virgules dans les arguments de macro en C/C ?

Linda Hamilton
Libérer: 2024-12-17 06:29:25
original
1013 Les gens l'ont consulté

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

Virgules dans les macros en C/C

On peut rencontrer des difficultés lors de l'utilisation de macros qui acceptent plusieurs arguments, en particulier lorsque les arguments contiennent des virgules. Prenons l'exemple suivant :

#define FOO(type, name) type name
Copier après la connexion

Bien qu'il soit simple d'utiliser la macro avec des arguments tels que :

FOO(int, int_var);
Copier après la connexion

Des problèmes surviennent lors du traitement d'arguments complexes impliquant des virgules, tels que :

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

Pour résoudre ce problème, on pourrait introduire une définition de type personnalisée :

typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var); // Compiles successfully
Copier après la connexion

Cependant, cela l'approche manque d'ergonomie et nécessite des conversions de types supplémentaires.

Une solution alternative consiste à définir une macro nommée COMMA :

#define COMMA ,
Copier après la connexion

Avec cette définition, des arguments complexes peuvent être passés à la macro à l'aide de la macro COMMA , par exemple :

FOO(std::map<int COMMA int>, map_var);
Copier après la connexion

Cette méthode permet également la stringification des arguments, comme illustré dans ce qui suit 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);
}
Copier après la connexion

Ce code affichera : "std::map a le nom typeid "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"."

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal