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
Libérer: 2024-12-18 15:45:16
original
562 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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);
Copier après la connexion

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);
}
Copier après la connexion

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

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal