这行在小型测试程序中正常工作,但在我想要的程序中,我得到以下编译器投诉:
#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); ?
答案 0 :(得分:74)
包含定义min
或max
宏的Windows标头时,通常会发生这种情况。如果您正在使用Windows标头,请在代码中添加#define NOMINMAX
,或使用等效的编译器开关进行构建(即对Visual Studio使用 / DNOMINMAX )。
请注意,使用NOMINMAX
构建会禁用整个程序中宏的使用。如果您需要使用min
或max
操作,请使用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)()
简单易用。