2011-03-09 138 views
3

代码:宏的实际参数太多?

#include <iostream> 

using namespace std; 

#define ADD(x,y) ((x)+(y)) 

int main(int argc, char** argv) 
{ 
    cout << ADD(1,2,) << endl; 
    return 0; 
} 

编译器输出:

1>Compiling...
1>main.cpp
1>c:\warn_test\main.cpp(9) : warning C4002: too many actual parameters for macro 'ADD'

为什么没有这样的错误?

g++ (GCC) 4.2.1 20070719 [FreeBSD]给出更合理的(在我心中)输出:

main.cpp:9:18: error: macro "ADD" passed 3 arguments, but takes just 2
main.cpp: In function 'int main(int, char**)':
main.cpp:9: error: 'ADD' was not declared in this scope

虽然我不能完全确定什么或者编译器认为第三个参数是。

编辑:添加完整的gcc输出和版本信息。

+2

我怀疑没有很好的理由,MSDN页面http://msdn.microsoft.com/en-us/library/y37zb304表明它根据编译器版本而变化,无论它是警告还是错误。也许是为了支持某些依赖于它的只是一个警告的可恶的遗留代码。第三个参数是一个0长度的令牌序列,如果有第三个宏参数,可以将其替换为宏扩展。请注意,标准允许实现编译具有任何特定于实现的含义的代码,只要它们发布诊断,所以它是“古怪”而不是“错误”。 – 2011-03-09 16:20:06

+0

什么是错误或警告是可配置的。您的抱怨是否说不同的编译器有不同的默认值?这将很容易解决你的项目设置! – 2011-03-09 17:08:16

回答

0

您使用ADD(1,2,),注意第二个,。删除它,它会编译得很好!

@schnaader:你说得对,我读得太快了。抱歉。

请提供有关编译器的更多详细信息。我用:G ++(Ubuntu的/ Linaro的4.4.4-14ubuntu5)4.4.5,这是结果我得到:

test.cpp:9: error: macro "ADD" passed 3 arguments, but takes just 2 
test.cpp: In function ‘int main(int, char**)’: 
test.cpp:9: error: ‘ADD’ was not declared in this scope 

[EDIT2] 不好意思,又有点太快:-)。我看到你用visual studio标记了它。 VS比g ++更宽容。我想 - 因为在这种情况下很容易解决 - 它会自动纠正它。

+2

这不是他的问题,他知道,因为他预计它会抛出一个错误... – schnaader 2011-03-09 16:14:52

+0

@schnaader:没错。警告行为让我感到非常反直觉。我想知道是否有C++规范的某些方面可以让Microsoft在这种情况下不会出错。 – genpfault 2011-03-09 16:17:56

+0

用完整的'gcc'版本和输出编辑我的问题。 – genpfault 2011-03-09 16:23:46

1

我想这是有点编译器的选择。如果有第三个参数,它可能会更成问题,但如果没有,您可以争论只是忽略逗号或抛出错误。微软似乎经常容忍更多的错误(如在IE浏览器HTML解析中)。

2

我打算抛出一个完整的猜测,受Steve Jessop的评论的启发,它与可变宏支持有关。

当Visual Studio团队实现可变宏时,可能会更容易使它成为警告。我注意到实现类似代码时的不同级别的容差:

#define MACRO(...) my_func(true, __VA_ARGS__); 

MACRO(1,,2); // Missing argument 
MACRO(1,); // missing tail 
MACRO(); // no arguments 

某些编译器错误,警告或忽略各种情况。我不知道标准所说的是什么。