5

是否可以在可变参数宏中的变量参数之前添加默认参数?例如,我有类似的宏版本

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

我想在变量参数之前在宏中添加另外 2 个默认参数,这样它就不会影响以前的版本。喜欢:

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

任何帮助,将不胜感激。

4

3 回答 3

5

你可以做什么:

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

于 2010-02-24T11:59:06.620 回答
4

我不认为这是可能的。编译器/预处理器如何知道第二个和第三个参数是变量参数的一部分还是覆盖默认值?这就是为什么具有默认值的参数必须位于函数中的最后位置的原因。

如果您能够指定 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__)
于 2010-02-24T11:56:58.743 回答
0

不是作为您问题的答案,而是作为一种简单地解决您的问题的方法:

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

void func (type1 arg1, type2 arg2 = "", type3 arg3 = "", ...);
于 2011-10-19T10:23:59.693 回答