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
Linda Hamiltonoriginal
2024-12-11 06:45:09736parcourir

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

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

FOO(int, int_var);

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

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

Basé sur une macro Solution

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

#define COMMA ,

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

FOO(std::map<int COMMA int>, map_var);

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);
}

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!

Déclaration:
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