Maison >développement back-end >C++ >Comment les virgules dans les macros C/C peuvent-elles améliorer la flexibilité des macros et la gestion des arguments ?

Comment les virgules dans les macros C/C peuvent-elles améliorer la flexibilité des macros et la gestion des arguments ?

DDD
DDDoriginal
2024-12-18 15:45:16573parcourir

How Can Commas in C/C   Macros Improve Macro Flexibility and Argument Handling?

Virgules dans les macros C/C : capacités étendues

Énoncé du problème :

Envisagez un macro définie comme suit :

#define FOO(type, name) type name

Cette macro attribue un type et nom à une variable. Cependant, des complexités surviennent lors de l'utilisation de structures de données complexes dans la macro, comme illustré ci-dessous :

FOO(std::map<int, int>, map_var); // Error: Excess arguments passed to macro

Solutions de contournement :

Une solution de contournement consiste à définir un alias de type pour simplifier le expression :

typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var); // Valid

Macro améliorée Syntaxe :

Il existe cependant une solution plus efficace et ergonomique : définir une macro COMMA. En séparant l'opérateur virgule de la liste d'arguments, il devient possible de transmettre des expressions complexes à la macro FOO d'origine :

#define COMMA ,

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

Cette syntaxe étendue facilite également la stringification des arguments de macro, permettant un code plus dynamique et informatif :

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

Cette approche améliorée imprime le résultat suivant :

std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"

En introduisant une macro COMMA personnalisée, l'expressivité et la flexibilité des macros est considérablement améliorée, permettant la gestion de types de données plus complexes et la stringification des arguments de macro.

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
Article précédent:Est-ce que le 'Article suivant:Est-ce que le '