我在C中的 #define 语句中的可选参数有问题,或者更具体地说是 gcc 4.2:
bool func1(bool tmp) { return false; }
void func2(bool tmp, bool tmp2) {}
#define CALL(func, tmp, ...) func(tmp, ##__VA_ARGS__)
int main() {
// this compiles
CALL(func2, CALL(func1, false), false);
// this fails with: Implicit declaration of function 'CALL'
CALL(func2, false, CALL(func1, false));
}
这显然是一个人为的例子,但确实显示了问题。有谁知道我怎样才能正确获得“解决”的可选参数?
附加信息:如果我删除##
before __VA_ARGS__
,并执行以下操作:
bool func2(bool tmp, bool tmp2) { return false; }
#define CALL(func, tmp, ...) func(tmp, __VA_ARGS__)
int main() {
CALL(func2, false, CALL(func2, false, false));
}
编译,但它不再适用于零参数,因为它会解析为func(tmp, )
编辑:在将我的所有代码转换为依赖 P99 而不是我之前的代码之后(这最终大大破坏了我的代码,哎呀),我意外地发现这有效:
bool func1(bool tmp) { return false; }
void func2(bool tmp, bool tmp2) {}
#define CALL2(func, tmp, p...) func(tmp, ##p)
#define CALL(func, tmp...) CALL2(func, tmp)
int main() {
// works
CALL(func2, CALL(func1, false), false);
// ...also works
CALL(func2, false, CALL(func1, false));
}
编译并使用任意数量的参数(并且传入和返回正确的值),但是......这应该是合法的吗?