警告C4003和错误C2589和C2059 on:x = std :: numeric_limits <int> :: max();

Har*_*vey 56 c++ max visual-c++ numeric-limits

这行在小型测试程序中正常工作,但在我想要它的程序中,我得到以下编译器投诉:

#include <limits>

x = std::numeric_limits<int>::max();

c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max'
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::'
c:\...\x.cpp(192) : error C2059: syntax error : '::'
Run Code Online (Sandbox Code Playgroud)

我得到了相同的结果:

#include <limits>
using namespace std;

x = numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)

为什么它将max视为宏max(a,b); ?

Ste*_*idi 74

包含定义minmax宏的Windows标头时,通常会发生这种情况.如果您正在使用Windows标头,请#define NOMINMAX输入您的代码,或使用等效的编译器开关构建(即使用/ DNOMINMAX for Visual Studio).

请注意,构建时NOMINMAX禁用整个程序中的宏.如果您需要使用minmax操作,请使用std::min()std::max()<algorithm>标题中.

  • @Harvey:#undef影响整个翻译单元的其余部分(与"它所在的文件的其余部分"非常不同),可能导致结果高度依赖于包含顺序,并可能干扰预编译的标题.这个答案是首选的解决方案.像min和max这样的宏会导致复杂的问题.宏在C++中是邪恶的. (4认同)

den*_*-bu 62

其他解决方案是使用括号括起函数名称,如下所示:(std::numeric_limits<int>::max)().同样适用于std::max.

不确定这是一个很好的解决方案... NOMINMAX是更好的IMO,但在某些情况下这可能是一个选项.

  • 不幸的是,min和max宏在Windows Platform SDK中被广泛使用(例如在GDI + GdiplusTypes.h中).所以,你回答比定义NOMINMAX更好.+1! (6认同)

R S*_*hko 27

其他一些头文件使用max宏污染全局名称空间.您可以通过取消定义宏来解决这个问题:

#undef max
x = std::numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)

  • 不要以这种方式修复它,你可以用`NOMINMAX`来阻止它首先被定义. (5认同)