Maison >développement back-end >C++ >Comment puis-je gérer correctement les virgules dans les macros C/C avec plusieurs arguments ?
En C/C, les macros sont souvent utilisées pour simplifier et généraliser le code. Cependant, lorsque les macros prennent plusieurs arguments, il peut être difficile de gérer correctement les virgules.
Considérez la macro suivante :
#define FOO(type, name) type name
Cette macro peut être utilisée pour déclarer une variable d'un type spécifique , par exemple :
FOO(int, int_var);
Cependant, si le type contient des virgules, comme dans un paramètre de modèle de modèle, la macro échoue. Par exemple :
FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
Pour résoudre ce problème, une option consiste à introduire une définition de type :
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // OK
Bien que cette approche fonctionne, elle peut être lourde et introduire des problèmes de compatibilité de type.
Une solution alternative consiste à utiliser la macro COMMA du préprocesseur :
#define COMMA , FOO(std::map<int COMMA int>, map_var);
Cela permet aux virgules de être inclus dans les arguments de la macro sans provoquer d'erreurs. De plus, il peut être utilisé pour fusionner des arguments de macro en chaînes :
#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'imprime :
std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
En utilisant la macro COMMA, les développeurs peuvent éviter les typedefs et s'assurer que les virgules sont géré correctement dans les macros.
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!