将多参数函数传递给宏

时间:2009-06-11 12:48:21

标签: c++ c macros

为什么这不能在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 :)
}

5 个答案:

答案 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));