使用Visual Studio 2012 MFC项目中的NOMINMAX

6
我想在使用MFC的Visual Studio C++项目中使用#define NOMINMAX,这样我就可以使用std::minstd::max了。然而,当我把这行代码放到我的stdafx.h中时,我会得到以下编译错误:

c:\program files (x86)\windows kits\8.0\include\um\GdiplusTypes.h(475): error C3861: 'min': identifier not found

我没有故意使用GDI+,这是MFC必须要做的事情。能否通过删除GDI+或将其调整为编译来解决这个问题?

似乎有一个类似的问题,其中提到了一种解决方法,但我不理解描述解决方法的步骤:https://dev59.com/bm445IYBdhLWcg3wWI2L#4914108 - Suma
2个回答

11

我不使用Windows,所以不习惯处理这个问题,我也没有测试过,但我认为那个答案建议你这样做:

#define NOMINMAX
#include <algorithm>
namespace Gdiplus
{
  using std::min;
  using std::max;
};
//... your other includes.

这将获取minmax的“正确”版本,并使它们在没有std :: 前缀的情况下可用(这似乎是在GdiplusTypes.h头文件中使用的方式)。


这样做可以消除编译错误,但它会将min和max带入全局作用域,而答案明确指出这是一件坏事。然而,这帮助我理解了它的意义。我已编辑代码以实现答案中描述的内容。 - Suma
1
@Suma 请看我的答案,这个解决方案 不会 将 min 和 max 带入全局作用域。 - James M

5

WinAPI中的minmax是宏,所以在包含MFC或WinAPI头文件后,您只需使用#undef取消定义它们即可:

#undef min
#undef max

不要 #define NOMINMAX - snips-n-snails

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接