#define NOMINMAX使用std :: min/max

Nat*_*mon 32 c++ winapi visual-studio

我最近补充说:

#define NOMINMAX
#include <Windows.h>
#include <algorithm>
Run Code Online (Sandbox Code Playgroud)

到我的main.cpp才能使用

std::max( x , x ); // x is just a placeholder and not actual anything
std::min( x  , x );
Run Code Online (Sandbox Code Playgroud)

但我不能std::max()/std::min()在其他文件中使用.

error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
Run Code Online (Sandbox Code Playgroud)

我试图添加#define NOMINMAX我的其他文件,但失败了.什么是线索?

我问之前环顾四周,但我不明白答案在Visual C++上NOMINMAX可能出现问题

Pet*_*ker 75

如果你真的很绝望,请在函数名称周围加上括号:

(std::min)(x, y);
Run Code Online (Sandbox Code Playgroud)

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


hmj*_*mjd 23

NOMINMAX通过编译器标志定义:

> cl.exe -DNOMINMAX ...
Run Code Online (Sandbox Code Playgroud)

然后将为所有源文件定义.我不使用IDE,但此页面提供了有关导航IDE以设置此指南的指导:在Windows程序中使用STL可能导致最小/最大冲突 :

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

  • 通过编译器标志定义`NOMINMAX`:> cl.exe -DNOMINMAX ...导致以下大约12行... 1> c:\ program files\microsoft sdks\windows\v7.0a\include\gdiplustypes.h (470):错误C3861:'min':找不到标识符我正在使用GDI的东西.谢谢 (9认同)
  • 对于 **NaturalDemon**,这里有您问题的解决方案 -- http://stackoverflow.com/a/4914108/867349 (2认同)

Dav*_*ann 10

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

例如:

#define NOMINMAX

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

// Include Windows headers
#include <windows.h>
#include <gdiplus.h>
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果您不想对全局名称空间造成太多污染,请使用std :: min;。使用std :: max;`可能是一个更好的解决方案。 (8认同)
  • `std::min/max` 与宏不同,要求两个参数的类型相同。这可能并不总是适用于所有使用宏的库。更好的解决方案是不定义“NOMINMAX”,包括“Windows.h”和所有需要这些宏的库,然后包括“#undef min/max”。因此,包含的库可以工作,并且没有全局名称空间污染。 (3认同)

Kan*_*nRG 6

在 Visual Studio 中,将“NOMINMAX”添加到 C++ 预处理器属性解决了我的问题。

打开项目属性 -> C/C++ -> 预处理器 -> 预处理器定义 -> 添加“NOMINMAX”。


Tom*_*Tom 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
Run Code Online (Sandbox Code Playgroud)

所以#define NOMINMAX告诉编译器(或实际预处理器)跳过的定义minmax,但如果你在你面前做只会适用#include "windows.h"