代码:宏的实际参数太多?
#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
输出和版本信息。
我怀疑没有很好的理由,MSDN页面http://msdn.microsoft.com/en-us/library/y37zb304表明它根据编译器版本而变化,无论它是警告还是错误。也许是为了支持某些依赖于它的只是一个警告的可恶的遗留代码。第三个参数是一个0长度的令牌序列,如果有第三个宏参数,可以将其替换为宏扩展。请注意,标准允许实现编译具有任何特定于实现的含义的代码,只要它们发布诊断,所以它是“古怪”而不是“错误”。 – 2011-03-09 16:20:06
什么是错误或警告是可配置的。您的抱怨是否说不同的编译器有不同的默认值?这将很容易解决你的项目设置! – 2011-03-09 17:08:16