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

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

Linda Hamilton
Libérer: 2024-12-11 06:45:09
original
737 Les gens l'ont consulté

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

Virgule dans les macros C/C

Dans les macros C/C, il est souvent nécessaire de séparer plusieurs arguments par des virgules. Cependant, des problèmes surviennent lorsque la macro attend un nombre spécifique d'arguments et que leur fourniture provoque plus ou moins des erreurs.

Scénario de problème

Considérons une macro définie comme suit :

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

Bien que cette macro puisse être utilisée simplement, Par exemple :

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

Cela devient problématique lorsque des types complexes sont impliqués :

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

Solution traditionnelle

Une approche courante consiste à créer un nouvel alias de type et utilisez-le dans la macro :

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

Basé sur une macro Solution

Alternativement, vous pouvez définir une macro représentant une virgule :

#define COMMA ,
Copier après la connexion

Grâce à cette macro, vous pouvez désormais transmettre des types complexes sans erreurs :

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

Cas d'utilisation supplémentaire

Cette approche s'avère également utile lors de la chaîne d'arguments de macro, comme illustré ci-dessous :

#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'imprimera :
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