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

时间:2009-12-15 01:08:29

标签: c++ visual-c++ max 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 : '::'

我得到了相同的结果:

#include <limits>
using namespace std;

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

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

6 个答案:

答案 0 :(得分:74)

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

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

答案 1 :(得分:62)

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

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

答案 2 :(得分:27)

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

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

答案 3 :(得分:3)

#ifdef max
#pragma push_macro("max")
#undef max
#define _restore_max_
#endif

#include <limits>

//... your stuff that uses limits

#ifdef _restore_max_
#pragma pop_macro("max")
#undef _restore_max_
#endif

答案 4 :(得分:0)

在Visual Studio 2013中为我定义(格式化为更好的间距...)如下:

static _Ty (max)() _THROW0()
{   // return maximum value
    return (FLT_MAX);
}

所以我只是使用FLT_MAX。 :)这可能不是一个通用的解决方案,但它在我的情况下运作良好,所以我想我会分享。

答案 5 :(得分:0)

(std :: numeric_limits :: max)()

简单易用。

相关问题