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 ) )

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)

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top