Comment faire une macro variadique (nombre variable d'arguments)
-
22-08-2019 - |
Question
Je veux écrire une macro dans C qui accepte un certain nombre de paramètres, pas un nombre spécifique
exemple:
#define macro( X ) something_complicated( whatever( X ) )
où X
est un nombre quelconque de paramètres
J'ai besoin parce que whatever
est surchargé et peut être appelé avec 2 ou 4 paramètres.
J'ai essayé de définir la macro deux fois, mais la deuxième définition réenregistrés le premier!
Le compilateur je travaille avec est g ++ (plus spécifiquement, MinGW)
La solution
C99 façon, également supporté par le compilateur C.
#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
Autres conseils
__VA_ARGS__
est le moyen standard pour le faire. Ne pas utiliser hacks compilateur spécifique si vous n'avez pas.
Je suis vraiment ennuyé que je ne peux pas commenter le message original. Dans tous les cas, C ++ n'est pas une surcouche de C. Il est vraiment stupide de compiler votre code C avec un compilateur C ++. Ne pas faire ce que Donny Ne pas fait.
Je ne pense pas que ce soit possible, vous pouvez truquer avec double parens ... aussi longtemps que vous n'avez pas besoin des arguments individuellement.
#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))
#define DEBUG
#ifdef DEBUG
#define PRINT print
#else
#define PRINT(...) ((void)0) //strip out PRINT instructions from code
#endif
void print(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
vsprintf(str, fmt, args);
va_end(args);
printf("%s\n", str);
}
int main() {
PRINT("[%s %d, %d] Hello World", "March", 26, 2009);
return 0;
}
Si le compilateur ne comprend pas les macros variadique, vous pouvez également dépouiller IMPRIMER avec un des éléments suivants:
#define PRINT //
ou
#define PRINT if(0)print
Les premiers commentaires sur les instructions d'impression, la seconde empêche instruction d'impression en raison d'un NULL si la condition. Si l'optimisation est défini, le compilateur doit dépouiller les instructions ne sera exécutée comme: if (0) print ( « Bonjour tout le monde »); ou ((void) 0);
expliqué g ++ ici, même si elle fait partie de C99 devrait donc travailler pour tout le monde
http://www.delorie.com/gnu/docs/gcc /gcc_44.html
exemple rapide:
#define debug(format, args...) fprintf (stderr, format, args)