2010-02-24 6 views
5

Ist es möglich, Standardargumente vor Variable Argument in variadic Makro hinzufügen? beispiels Ich habe die Version von Makro so etwas wieHinzufügen von Standardargumenten zu Variadic-Makro

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

Ich möchte zwei Argumente mehr standardmäßig in der Makro vor Variable Argumente hinzufügen, so dass es nicht Vorversion beeinflussen sollte. Wie:

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

Jede Hilfe wäre willkommen.

+1

C nicht Standardargumente unterstützt. Meinst du C++? –

+0

Nicht sicher Verstehen, funktioniert nicht

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

+0

Ja. Vergaß zu erwähnen. Es ist für C++. Danke – vishal

Antwort

4

Ich glaube nicht, dass das möglich ist. Wie würde der Compiler/Präprozessor wissen, ob das zweite und das dritte Argument Teil der Variablenargumente sind oder die Standardwerte überschreiben? Aus diesem Grund müssen Parameter mit Default-Werten in einer Funktion an letzter Stelle stehen.

Ich fürchte, Sie müssen zwei Makros oder drei haben, wenn Sie Arg2 angeben können und Arg3 Standardwert verwenden, aber das ist fehleranfällig.

#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

Was können Sie tun:

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" 

Bad an diesem - Null Parameter wie kein Parameter behandelt wird, z.B. BAR(0, 'c') wird String 10, c, default

+0

Unglücklicherweise wird dies nicht ausreichen, wenn die Argumente, die zu einem Fehler führen sollen, Typnamen sein sollen. – PSkocik

+0

@PSkocik Was meinst du? Könnten Sie bitte etwas ausarbeiten? – qrdl

0

Nicht als Antwort auf Ihre Frage zu produzieren, sondern als eine Möglichkeit, um Ihr Problem zu lösen einfach:

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

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