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!