How do I call std::min
when min
has already been defined as a macro?
问题:
回答1:
(std::min)(x,y)
The parentheses around min
prevent macro expansion. This works with all function macros.
回答2:
On Windows, you need to define NOMINMAX
before including any windows headers, preferable at the beginning of precompiled header. More info here
回答3:
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.
回答4:
You might be able to avoid the macro definition by:
#undef
- avoid the definition in the first place (either by configuration such as
#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.
回答5:
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)