Maison > Article > développement back-end > Comment implémenter des paramètres facultatifs dans les macros C et quelles sont les limites de cette approche ?
En C, les macros peuvent être un outil puissant pour la réutilisation et l'abstraction du code. Cependant, ils manquent également d’une certaine flexibilité que l’on peut trouver dans les langages de programmation orientés objet traditionnels. L'une de ces fonctionnalités est la possibilité de définir des paramètres facultatifs dans une macro.
Pour définir des paramètres facultatifs dans une macro, vous pouvez utiliser une combinaison de listes d'arguments et d'astuces de préprocesseur. Une approche courante consiste à utiliser une macro dans une macro pour fournir la fonctionnalité de surcharge. Par exemple :
#define PRINT_STRING_1_ARGS(message) PrintString(message, 0, 0) #define PRINT_STRING_2_ARGS(message, size) PrintString(message, size, 0) #define PRINT_STRING_3_ARGS(message, size, style) PrintString(message, size, style)
Ici, trois macros (PRINT_STRING_1_ARGS, PRINT_STRING_2_ARGS et PRINT_STRING_3_ARGS) sont définies, chacune avec un nombre différent de paramètres. Pour choisir la bonne macro en fonction du nombre de paramètres passés, une astuce du préprocesseur est utilisée :
#define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4 #define PRINT_STRING_MACRO_CHOOSER(...) \ GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \ PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, ) #define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
La macro GET_4TH_ARG extrait le quatrième argument de la liste d'arguments variables (__VA_ARGS__), qui dans ce cas représente le macro souhaitée à appeler.
Pour utiliser le mécanisme de paramètre facultatif, vous pouvez appeler la macro PRINT_STRING comme suit :
PRINT_STRING("Hello, World!"); // Call with 1 argument PRINT_STRING("Hello, World!", 18); // Call with 2 arguments PRINT_STRING("Hello, World!", 18, bold); // Call with 3 arguments
Il est important de noter que cette approche présente certaines limites par rapport à la véritable surcharge dans les langages orientés objet :
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!