Virgule en macro C/C : une solution pour plusieurs arguments de macro
Les macros en C/C offrent un moyen pratique d'étendre un préprocesseur directive dans un bloc de code. Cependant, lorsque les macros acceptent plusieurs arguments, la gestion des virgules peut devenir un défi.
Considérons l'exemple de macro :
#define FOO(type,name) type name
Cette macro attend deux arguments : un type et un nom. Son utilisation est simple dans les cas simples :
FOO(int, int_var);
Mais lorsque le type est plus complexe, comme un modèle ou un conteneur, passer des virgules peut entraîner des erreurs :
FOO(std::map<int, int>, map_var); // error
Un La solution consiste à définir un alias de type pour supprimer le besoin de virgules :
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var);
Cependant, cette approche peut être lourde et introduire une compatibilité de type problèmes.
Une solution alternative consiste à utiliser une macro virgule pour gérer les virgules dans la définition de la macro elle-même :
#define COMMA , FOO(std::map<int COMMA int>, map_var);
Cela définit une macro virgule qui peut être placée entre les arguments pour gérer les séparation par virgule. Cette méthode fournit un moyen plus propre et plus simple de transmettre des types complexes à une macro :
#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 imprimera les informations de type pour std::map
std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
L'utilisation d'une macro virgule permet plus de flexibilité et une syntaxe plus claire lorsque vous travaillez avec des macros qui acceptent plusieurs arguments.
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!