2010-02-24 16 views
5

¿Es posible agregar argumentos predeterminados antes del argumento variable en macro variadic? por ejemplo tengo la versión de macro algo así comoAgregar argumentos predeterminados a la macro variadic

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

me gustaría añadir 2 más argumentos por defecto en la macro antes de argumentos variables de modo que no debería afectar a la versión anterior. Me gusta:

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

Cualquier ayuda sería apreciada.

+1

C no admite los argumentos por defecto. ¿Te refieres a C++? –

+0

No estoy seguro En entiendo, ¿no funcionará

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

+0

Sí. Olvide mencionar. Es para C++. Gracias – vishal

Respuesta

4

No creo que esto sea posible. ¿Cómo sabría el compilador/preprocesador si los argumentos segundo y tercero son parte de los argumentos variables o anulan los valores predeterminados? Esa es la razón por la que los parámetros con valores predeterminados deben estar en la última posición de una función.

Me temo que tendrá que tener dos macros o tres si puede especificar arg2 y usar el valor predeterminado de arg3, pero esto es propenso a errores.

#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

Lo que puede hacer:

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" 

malo de este parámetro - cero es tratado como ningún parámetro, por ejemplo, BAR(0, 'c') producirá cadena 10, c, default

+0

Desafortunadamente, esto no servirá de nada si los argumentos por defecto están destinados a ser nombres de tipos. – PSkocik

+0

@PSkocik ¿Qué quieres decir? ¿Podrías por favor elaborar? – qrdl

0

No como una respuesta a su pregunta, sino como una manera de resolver su problema simplemente:

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

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