c++ - 宏的实际参数太多?

标签 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>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 输出和版本信息。

最佳答案

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

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

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

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

一些编译器错误、警告或忽略各种情况。我不知道标准是怎么说的。

关于c++ - 宏的实际参数太多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248599/

相关文章:

c++ - 使用递归反向链表

visual-studio - Visual Studio : How to make one solution depend on another?

c++ - #define 预处理器指令可以包含 if 和 else 吗?

c++ - 您可以在 C++ 中制作自定义运算符吗?

c++ - VS2008 在特定的大型 C++ 解决方案上非常慢

c++ - 定义异常,它是如何工作的?

c++ - Vera++ TCL 规则 : list all local variables

C++ 将值设置为类内的枚举项

为多个供应商发现 sql 数据库模式的 C++ 库?

c++ - Qt creator 中的 Pantheios 与 VS C++ 2008 编译器