Maison >développement back-end >C++ >Comment puis-je gérer les virgules dans les arguments de macro en C/C ?
On peut rencontrer des difficultés lors de l'utilisation de macros qui acceptent plusieurs arguments, en particulier lorsque les arguments contiennent des virgules. Prenons l'exemple suivant :
#define FOO(type, name) type name
Bien qu'il soit simple d'utiliser la macro avec des arguments tels que :
FOO(int, int_var);
Des problèmes surviennent lors du traitement d'arguments complexes impliquant des virgules, tels que :
FOO(std::map<int, int>, map_var); // Error: 3 arguments passed to macro 'FOO', which takes only 2
Pour résoudre ce problème, on pourrait introduire une définition de type personnalisée :
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // Compiles successfully
Cependant, cela l'approche manque d'ergonomie et nécessite des conversions de types supplémentaires.
Une solution alternative consiste à définir une macro nommée COMMA :
#define COMMA ,
Avec cette définition, des arguments complexes peuvent être passés à la macro à l'aide de la macro COMMA , par exemple :
FOO(std::map<int COMMA int>, map_var);
Cette méthode permet également la stringification des arguments, comme illustré dans ce qui suit code :
#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 affichera : "std::map
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!