How to call std::min() when min has been defined a

2019-01-25 01:54发布

问题:

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)


标签: c++ stl macros