Virgule dans les macros C/C
Dans les macros C/C, il est souvent nécessaire de séparer plusieurs arguments par des virgules. Cependant, des problèmes surviennent lorsque la macro attend un nombre spécifique d'arguments et que leur fourniture provoque plus ou moins des erreurs.
Scénario de problème
Considérons une macro définie comme suit :
#define FOO(type, name) type name
Bien que cette macro puisse être utilisée simplement, Par exemple :
FOO(int, int_var);
Cela devient problématique lorsque des types complexes sont impliqués :
FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
Solution traditionnelle
Une approche courante consiste à créer un nouvel alias de type et utilisez-le dans la macro :
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // OK
Basé sur une macro Solution
Alternativement, vous pouvez définir une macro représentant une virgule :
#define COMMA ,
Grâce à cette macro, vous pouvez désormais transmettre des types complexes sans erreurs :
FOO(std::map<int COMMA int>, map_var);
Cas d'utilisation supplémentaire
Cette approche s'avère également utile lors de la chaîne d'arguments de macro, comme illustré ci-dessous :
#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'imprimera :
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!