Maison > développement back-end > C++ > Comment puis-je gérer correctement les virgules dans les macros C/C avec plusieurs arguments ?

Comment puis-je gérer correctement les virgules dans les macros C/C avec plusieurs arguments ?

Patricia Arquette
Libérer: 2024-12-11 16:19:20
original
392 Les gens l'ont consulté

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

Macros et virgules en C/C

En C/C, les macros sont souvent utilisées pour simplifier et généraliser le code. Cependant, lorsque les macros prennent plusieurs arguments, il peut être difficile de gérer correctement les virgules.

Considérez la macro suivante :

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

Cette macro peut être utilisée pour déclarer une variable d'un type spécifique , par exemple :

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

Cependant, si le type contient des virgules, comme dans un paramètre de modèle de modèle, la macro échoue. Par exemple :

FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
Copier après la connexion

Pour résoudre ce problème, une option consiste à introduire une définition de type :

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

Bien que cette approche fonctionne, elle peut être lourde et introduire des problèmes de compatibilité de type.

Une solution alternative consiste à utiliser la macro COMMA du préprocesseur :

#define COMMA ,

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

Cela permet aux virgules de être inclus dans les arguments de la macro sans provoquer d'erreurs. De plus, il peut être utilisé pour fusionner des arguments de macro en chaînes :

#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 s'imprime :

std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
Copier après la connexion

En utilisant la macro COMMA, les développeurs peuvent éviter les typedefs et s'assurer que les virgules sont géré correctement dans les macros.

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