为什么这不能在VC 2005上编译?
bool isTrue(bool, bool) { return true; }
void foo();
#define DO_IF(condition, ...) if (condition) foo(__VA_ARGS__);
void run()
{
DO_IF(isTrue(true, true)); // error C2143: syntax error : missing ')' before 'constant'
}
仅通过预处理器运行输出:
bool isTrue(bool, bool) { return true; }
void foo();
void run()
{
if (isTrue(true true)) foo();;
}
注意倒数第二行中缺少的逗号。
上次修改:
LOL!
bool isTrue(bool, bool) { return true; }
void foo();
#define DO_IF(condition, ...) if (condition) { foo(__VA_ARGS__); }
void run()
{
DO_IF(isTrue(true ,, true)); // ROTFL - This Compiles :)
}
答案 0 :(得分:3)
1990 C标准或当前的C ++标准中不存在具有无限数量参数的宏。我认为它们是在1999 C标准中引入的,并且采用该标准的变化实施起来相当缓慢。他们将采用即将推出的C ++标准(我认为明年很可能会出来)。
我没有费心去跟踪Visual Studio中的C99合规性,主要是因为我只使用C语言的东西需要极端的可移植性,而我还不能用C99来实现。然而,VS 2005很可能缺少VS2008的部分C99。
或者,可能是您正在将程序编译为C ++。检查编译器属性。
答案 1 :(得分:1)
通过CPP(C预处理器)运行代码,以查看CPP为您的宏所做的替换。
您可以通过调用cpp
或向编译器提供-E
参数来实现(当然,如果您使用gcc
)。
答案 2 :(得分:1)
各种预处理器实现贪婪地解析逗号,将它们视为宏参数的分隔符。因此,CPP认为您要求“DO_IF”用两个参数“isTrue(true”和“true”)进行替换。
答案 3 :(得分:0)
如果我将DO_IF更改为RETURN_IF,您的代码在VS2008中编译得很好。但是,这不应该改变与您的错误相关的任何内容。
编辑:即使在更改后,仍然可以编译而不会出现错误。
答案 4 :(得分:0)
我认为这应该有效,除非它不应该......
RETURN_IF(isTrue(b, !b));
和
RETURN_IF(isTrue(b, b));