是否可以在可变参数宏中的变量参数之前添加默认参数? 例如,我有像
这样的宏版本#define MACRO(arg1, ...) func(arg1, ##__VA_ARGS__)
我想在变量参数之前在宏中再添加2个默认参数,这样它就不会影响以前的版本。像:
#define MACRO(arg1, arg2 = "", arg3 = "", ...) func(arg1, arg2, arg3, ##__VA_ARGS__)
任何帮助都将不胜感激。
答案 0 :(得分: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
答案 1 :(得分: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__)
答案 2 :(得分:0)
不是您问题的答案,而是简单解决问题的方法:
#define MACRO(arg1, ...) \
/* pre-treatment */ \
func(arg1, ##__VA_ARGS__) \
/* post-treatment */ \
void func (type1 arg1, type2 arg2 = "", type3 arg3 = "", ...);