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
910 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!

source:php.cn
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