What problems could I get when defining NOMINMAX
before anything else in my program?
As far as I know, this will make <Windows.h>
not define the min
and max
macros such that many conflicts with the STL, e.g. std::min()
, std::max()
, or std::numeric_limits<T>::min()
are resolved.
Am I right in the assumption that only Windows-specific and legacy code will have problems?
Almost all libraries should not depend on min()
and max()
defined as macros?
Edit: Will there be be problems with other Windows headers?
For precompiled header (like stdafx.h) I use this:
I generally use
NOMINMAX
like this to limit the potential side effects:That way the scope of the
NOMINMAX
is relatively confined.It's not a perfect solution. If something else has already defined
NOMINMAX
, this pattern fails (though I've never encountered such a case).If you want to be really, really careful, then you can #include a wrapper header wherever you would have #included windows.h. The wrapper would go something like this:
You could imagine doing other things in the wrapper, too, like enforcing
UNICODE
and/orSTRICT
.Using
NOMINMAX
is the only not-completely-evil way to include<windows.h>
. You should also defineUNICODE
andSTRICT
. Although the latter is defined by default by modern implementations.You can however run into problems with Microsoft’s headers, e.g. for GdiPlus. I’m not aware of problems with headers from any other companies or persons.
If the header defines a namespace, as GdiPlus does, then one fix is to create a wrapper for the relevant header, where you include
<algorithm>
, and inside the header’s namespace,using namespace std;
(or alternativelyusing std::min;
andusing std::max
):Note that that is very different from a
using namespace std;
at global scope in header, which one should never do.I don’t know of any good workaround for the case where there's no namespace, but happily I haven’t run into that, so in practice that particular problem is probably moot.
I got fix issue by declaring the headers and namespaces in the following order: