std :: max - 期望一个标识符

Jay*_*Jay 37 c++

我遇到了问题std::max.我无法弄清楚.

int border = 35;
int myInt = 2;
int myOtherInt = 3;
int z = std::max(myInt + 2 * border, myOtherInt + 2 * border);
Run Code Online (Sandbox Code Playgroud)

我已经包含了算法标准头.当我鼠标移动到最大值时,我得到:

错误:期望标识符

并编译错误:

错误C2589 ::错误C2059 '('右侧的非法令牌'::'
:语法错误:'::'

怎么了?

ild*_*arn 62

由于您使用的是VC++,所以在任何#includes 之前都会出现这种情况:

#define NOMINMAX
Run Code Online (Sandbox Code Playgroud)

windows.h定义命名的宏min,max如下所示:

#define min(a,b)            (((a) < (b)) ? (a) : (b))
#define max(a,b)            (((a) > (b)) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)

自从C++标准化之前,Windows SDK已经包含了这些宏,但由于它们显然NOMINMAX会对C++标准库造成严重破坏,因此可以定义宏以防止它们被定义.

通常,如果您使用C++(而不是C)并包含windows.h,请始终NOMINMAX先定义.

  • @Jay:显然它是`<windows.h>`本身通过定义名为`min`和`max`的宏来搞乱一切.恭喜微软!更多[这里](http://stackoverflow.com/questions/4913922/possible-problems-with-nominmax-on-visual-c/4914108#4914108). (3认同)

Dav*_*e S 17

如果您使用的是VC++,则可以#define NOMINMAX先包含任何标题,也可以使用(std::max)(myInt + 2 * border, myOtherInt + 2 * border)

  • 哇这真棒!正是我在寻找的东西.我试图使用`std :: numeric_limits <uint32_t> :: max()`而愚蠢的windows.h导致预处理器插入std :: max()代替`max()`.简单地做`(std :: numeric_limits <uint32_t> :: max)()`就足以让预处理器做错了.我不想做NOMINMAX的事情,因为我担心在定义之前可能会包含windows.h,更不用说我自己的很多文件包括windows.h了.谢谢! (3认同)