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

后端 未结 5 1832
误落风尘
误落风尘 2020-12-15 15:54

How do I call std::min when min has already been defined as a macro?

相关标签:
5条回答
  • 2020-12-15 16:15

    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.

    0 讨论(0)
  • 2020-12-15 16:17

    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.

    0 讨论(0)
  • 2020-12-15 16:20

    On Windows, you need to define NOMINMAX before including any windows headers, preferable at the beginning of precompiled header.

    0 讨论(0)
  • 2020-12-15 16:20

    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)
    
    0 讨论(0)
  • 2020-12-15 16:22
    (std::min)(x,y)
    

    The parentheses around min prevent macro expansion. This works with all function macros.

    0 讨论(0)
提交回复
热议问题