c++ - Visual C++ 上 NOMINMAX 的可能问题

标签 c++ windows visual-c++

定义 NOMINMAX 时会遇到什么问题在我的程序中的任何其他内容之前?

据我所知,这将使 <Windows.h>未定义 minmax与 STL 有很多冲突的宏,例如std::min() , std::max() , 或 std::numeric_limits<T>::min()解决了。​​

我是否正确地假设只有 Windows 特定和遗留代码会出现问题? 几乎所有的库都不应该依赖 min()max()定义为宏?

编辑:其他Windows头文件会不会有问题?

最佳答案

使用 NOMINMAX是包含 <windows.h> 的唯一不完全邪恶的方式.您还应该定义 UNICODESTRICT .尽管后者是由现代实现默认定义的。

但是,您可能会遇到 Microsoft header 的问题,例如对于 GdiPlus。我不知道来自任何其他公司或个人的标题存在问题。

如果头文件定义了一个命名空间,就像 GdiPlus 所做的那样,那么一种解决方法是为相关头文件创建一个包装器,其中包含 <algorithm> ,并且在 header 的命名空间内,using namespace std; (或者 using std::min;using std::max ):

#define NOMINMAX
#include <algorithm>
namespace Gdiplus
{
  using std::min;
  using std::max;
}

请注意,这与 using namespace std; 非常不同。在 header 的全局范围内,永远不要这样做

对于没有命名空间的情况,我不知道有什么好的解决方法,但很高兴我没有遇到这种情况,所以在实践中这个特定问题可能没有实际意义。

关于c++ - Visual C++ 上 NOMINMAX 的可能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4913922/

相关文章:

visual-c++ - 如何在 Visual C++ 中抑制外部 header 中的警告

c++ - Sublime Text 找不到外部 C++ 库

c++ - SendMessage 到 64 位应用程序不起作用

windows - 我可以在容器内使用命名管道吗?

php - PHP 可以判断服务器操作系统是否为 64 位吗?

c++ - 如何使用 VS2003 工具集从 VS11 中构建 C++ 项目?

c++ - Box2D:如何让物体忽略重力

c++ - 使用 AWS-cpp-sdk 时,在退出程序之前等待异步调用返回

Windows:WAITING进程完成

c++ - noexcept + declval 在 MSVC 下编译失败