Добавление аргументов по умолчанию в макрокоманду - PullRequest
5 голосов
/ 24 февраля 2010

Возможно ли добавить аргументы по умолчанию перед переменным аргументом в макрокоманде variadic? например, у меня есть версия макроса что-то вроде

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

Я хотел бы добавить еще 2 аргумента по умолчанию в макрос перед переменными аргументами, чтобы он не влиял на предыдущую версию. Как:

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

Любая помощь будет оценена.

Ответы [ 3 ]

5 голосов
/ 24 февраля 2010

Что вы можете сделать:

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"

Плохая вещь об этом - нулевой параметр обрабатывается как никакой параметр, например BAR(0, 'c') будет производить строку 10, c, default

4 голосов
/ 24 февраля 2010

Я не думаю, что это возможно. Как бы компилятор / препроцессор узнал, являются ли второй и третий аргументы частью аргументов переменной или переопределяют значения по умолчанию? Вот почему параметры со значениями по умолчанию должны быть в последней позиции в функции.

Боюсь, вам понадобится два или три макроса, если вы сможете указать arg2 и использовать значение по умолчанию arg3, но это подвержено ошибкам.

#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__)
0 голосов
/ 19 октября 2011

Не как ответ на ваш вопрос, а как способ просто решить вашу проблему:

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

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