#define NOMINMAX使用std :: min / max

时间:2012-11-16 12:16:26

标签: c++ visual-studio winapi

我最近补充说:

#define NOMINMAX
#include <Windows.h>
#include <algorithm>

到我的main.cpp以便使用

std::max( x , x ); // x is just a placeholder and not actual anything
std::min( x  , x );

但我无法在其他文件中使用std::max()/std::min()

error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'

我尝试在其他文件中添加#define NOMINMAX,但失败了。什么是线索?

在询问之前我环顾四周,但我不明白答案Possible problems with NOMINMAX on Visual C++

4 个答案:

答案 0 :(得分:69)

如果你真的很绝望,请在功能名称周围添加括号:

(std::min)(x, y);

此语法不会应用类似函数的宏。 (形式上,要应用类似函数的宏,宏的名称必须后跟可选的空格,然后是'('。)

答案 1 :(得分:22)

通过编译器标志定义NOMINMAX

> cl.exe -DNOMINMAX ...

然后将为所有源文件定义。我不使用IDE,但此页面提供了有关导航IDE以设置此指南的指导:Using STL in Windows Program Can Cause Min/Max Conflicts

  

只需定义NOMINMAX预处理器符号即可。这可以在“构建”,“设置”下的“开发人员工作室”项目中,在“预处理器”类别的“C / C ++”选项卡上完成。这将抑制Windef.h中的最小和最大定义。

答案 2 :(得分:5)

#define NOMINMAX之后的问题可能就是#include "windows.h"#define首先是重要的。

原因是windows.h(实际上我认为windef.h,包含在windows.h中)的代码与此类似:

#ifndef NOMINMAX
#define min(x,y) ((x) < (y) ? (x) : (y))
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif

所以#define NOMINMAX告诉编译器(或实际上是预处理器)跳过minmax的定义,但它只适用于#include "windows.h"和{{1}}的定义{{1}} 1}}。

答案 3 :(得分:5)

如果您定义NOMINMAX,因为您更喜欢STL版本,那么在包含使用min / max宏的gdiplus.h时可能会遇到问题。 作为解决方案,您需要包含STL标头并使用“using namespace std”之前包含gdiplus.h。

例如:

#define NOMINMAX

// Include C++ headers
#include <algorithm>
using namespace std;

// Include Windows headers
#include <windows.h>
#include <gdiplus.h>