定义 NOMINMAX
时会遇到什么问题在我的程序中的任何其他内容之前?
据我所知,这将使 <Windows.h>
未定义 min
和 max
与 STL 有很多冲突的宏,例如std::min()
, std::max()
, 或 std::numeric_limits<T>::min()
解决了。
我是否正确地假设只有 Windows 特定和遗留代码会出现问题?
几乎所有的库都不应该依赖 min()
和 max()
定义为宏?
编辑:其他Windows头文件会不会有问题?
最佳答案
使用 NOMINMAX
是包含 <windows.h>
的唯一不完全邪恶的方式.您还应该定义 UNICODE
和 STRICT
.尽管后者是由现代实现默认定义的。
但是,您可能会遇到 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/