How do I call std::min
when min
has already been defined as a macro?
Use #undef min
in your code, after #include <>
directives.
#include <...> // bad header that defines `min` macro
#ifdef min
#undef min
#endif
// rest f code.
Addendum: If you need to keep the value of the min
macro afterwards, you can disable its definition temporarily using a non-portable solution on some compilers. For instance, Microsoft's C++ compiler has a push_macro pragma that also seems to be supported by GCC.
You might be able to avoid the macro definition by:
#undef
#define NOMINMAX
or similar or avoiding including the offending header)If those options can't be used or you don't want to use them, you can always avoid invoking a function-like macro with an appropriate use of parens:
#include <algorithm>
#include <stdio.h>
#define min(x,y) (((x) < (y)) ? (x) : (y))
int main()
{
printf( "min is %d\n", (std::min)( 3, 5)); // note: the macro version of `min` is avoided
}
This is portable and has worked since the dark, early days of C.
On Windows, you need to define NOMINMAX
before including any windows headers, preferable at the beginning of precompiled header.
I found a couple of other ways to do it:
Method 1:
using std::min;
min(a, b); // uses either the macro or the function (don't add side effects!)
Method 2:
#ifndef BOOST_PREVENT_MACRO_SUBSTITUTION
#define BOOST_PREVENT_MACRO_SUBSTITUTION
#endif
...
std::min BOOST_PREVENT_MACRO_SUBSTITUTION(a, b)
(std::min)(x,y)
The parentheses around min
prevent macro expansion. This works with all function macros.