Comment faire une macro variadic (nombre variable d’arguments)

Je veux écrire une macro dans C qui accepte un nombre quelconque de parameters, pas un nombre spécifique

Exemple:

#define macro( X ) something_complicated( whatever( X ) ) 

X est un nombre quelconque de parameters

J’en ai besoin car whatever ce whatever est surchargé peut être appelé avec 2 ou 4 parameters.

J’ai essayé de définir la macro deux fois, mais la deuxième définition a remplacé le premier!

Le compilateur avec lequel je travaille est g ++ (plus précisément, mingw)

    Manière C99, également supporté par le compilateur VC ++.

     #define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__) 

    __VA_ARGS__ est le moyen standard de le faire. N’utilisez pas de hacks spécifiques au compilateur si vous n’y êtes pas obligé.

    Je suis vraiment contrarié que je ne puisse pas commenter le message original. En tout cas, C ++ n’est pas un sur-ensemble de C. Il est vraiment idiot de comstackr votre code C avec un compilateur C ++. Ne fais pas ce que Donny ne fait pas.

    Je ne pense pas que ce soit possible, vous pouvez faire semblant avec des doubles 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) //ssortingp 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 variadiques, vous pouvez également supprimer PRINT avec l’un des éléments suivants:

     #define PRINT // 

    ou

     #define PRINT if(0)print 

    Le premier commente les instructions PRINT, le second empêche l’instruction PRINT à cause d’une condition NULL if. Si l’optimisation est définie, le compilateur doit supprimer les instructions jamais exécutées telles que: if (0) print (“hello world”); ou ((nul) 0);

    expliqué pour g ++ ici, même si cela fait partie de C99 devrait donc fonctionner pour tout le monde

    http://www.delorie.com/gnu/docs/gcc/gcc_44.html

    exemple rapide:

     #define debug(format, args...) fprintf (stderr, format, args)