宏的实际参数太多了?

时间:2011-03-09 16:11:33

标签: c++ visual-studio-2008 c-preprocessor compiler-warnings

代码:

#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&GT;编译...
      1 GT; main.cpp中
      1&gt; c:\ warn_test \ main.cpp(9):警告C4002:宏'ADD'的实际参数太多

为什么这不是错误?

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

  

main.cpp:9:18:错误:宏“ADD”传递了3个参数,但只需要2个       main.cpp:在函数'int main(int,char **)'中:
      main.cpp:9:错误:未在此范围内声明'ADD'

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

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

3 个答案:

答案 0 :(得分:2)

我将抛​​出一个完整的猜测,灵感来自Steve Jessop的评论,它与可变宏观支持相关。

当visual studio团队实现可变参数宏时,可能会更容易发出警告?在实现如下代码时,我注意到了不同程度的容差:

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

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

某些编译器出错,警告或忽略各种情况。我不知道标准是什么意思。

答案 1 :(得分:1)

您使用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 :(得分:1)

我想这是编译器的选择。如果有第三个参数,它可能会更有问题,但是由于没有,你可以争论只是忽略逗号或抛出错误。 Microsoft似乎经常更容错(例如在IE HTML解析中)。