2010-02-24 4 views
5

Est-il possible d'ajouter des arguments par défaut avant l'argument variable dans la macro variadique? J'ai la par exemple version de quelque chose comme macroAjout d'arguments par défaut à la macro variadique

#define MACRO(arg1, ...) func(arg1, ##__VA_ARGS__) 

Je voudrais ajouter 2 autres arguments par défaut dans la macro avant des arguments variables afin qu'il ne devrait pas affecter la version précédente. Comme:

#define MACRO(arg1, arg2 = "", arg3 = "", ...) func(arg1, arg2, arg3, ##__VA_ARGS__) 

Toute aide serait appréciée.

+1

C ne supporte pas les arguments par défaut. Voulez-vous dire C++? –

+0

Incertain Pour comprendre, ne fonctionnera pas

#define MACRO(arg1, ...) func(arg1, "", "", ##__VA_ARGS__)
? – philant

+0

Oui. Oublié de mentionner. C'est pour C++. Merci – vishal

Répondre

4

Je ne pense pas que ce soit possible. Comment le compilateur/préprocesseur sait-il si les deuxième et troisième arguments font partie des arguments variables ou remplacent les valeurs par défaut? C'est la raison pour laquelle les paramètres avec des valeurs par défaut doivent être en dernière position dans une fonction.

Je crains que vous deviez avoir deux macros ou trois si vous pouvez spécifier arg2 et utiliser la valeur par défaut arg3, mais cela est sujet aux erreurs.

#define MACRO(arg1, ...) func(arg1, "", "", ##__VA_ARGS__) 
#define MACRO2(arg1, arg2, ...) func(arg1, arg2, "", ##__VA_ARGS__) 
#define MACRO3(arg1, arg2, arg3, ...) func(arg1, arg2, arg3, ##__VA_ARGS__) 
5

Qu'est-ce que vous pouvez faire:

struct foo { 
    int aaa; 
    char bbb; 
    char *ccc; 
}; 

#define BAR(...) bar((struct foo){__VA_ARGS__}) 

void bar(struct foo baz) 
    /* set defaults */ 
    if (!baz.aaa) 
     baz.aaa = 10; 
    if (!baz.bbb) 
     baz.bbb = 'z'; 
    if (!baz.ccc) 
     baz.ccc = "default"; 

    printf("%d, %c, %s\n", baz.aaa, baz.bbb, baz.ccc); 
} 

... 
BAR();      // prints "10, z, default" 
BAR(5);     // prints "5, z, default" 
BAR(5,'b');    // prints "5, b, default" 
BAR(5, 'b', "something"); // prints "5, b, something" 

chose Bad à ce sujet - paramètre zéro est traité comme aucun paramètre, par exemple BAR(0, 'c') produira chaîne 10, c, default

+0

Malheureusement, cela ne fera pas l'affaire si les arguments à définir par défaut sont des noms de type. – PSkocik

+0

@PSkocik Que voulez-vous dire? Pourriez-vous élaborer? – qrdl

0

Pas comme une réponse à votre question, mais comme un moyen de résoudre simplement votre problème:

#define MACRO(arg1, ...)   \ 
    /* pre-treatment */   \ 
    func(arg1, ##__VA_ARGS__)  \ 
    /* post-treatment */   \ 

void func (type1 arg1, type2 arg2 = "", type3 arg3 = "", ...); 
Questions connexes