Подтвердить что ты не робот

Как вызвать std:: min(), когда min был определен как макрос?

Как мне позвонить std::min, когда min уже определен как макрос?

4b9b3361

Ответ 1

(std::min)(x,y)

Скобки вокруг min предотвращают расширение макроса. Это работает со всеми макросами функций.

Ответ 2

В Windows вам нужно определить NOMINMAX перед включением любых заголовков окон, предпочтительно в начале скомпилированного заголовка.

Ответ 3

Используйте #undef min в вашем коде, после #include <> директив.

#include <...> // bad header that defines `min` macro
#ifdef min
#undef min
#endif

// rest f code.

Добавление. Если вам нужно сохранить значение макроса min, вы можете временно отключить его определение, используя непереносимое решение для некоторых компиляторов. Например, компилятор Microsoft С++ имеет push_macro прагма, который также выглядит поддерживаемый GCC.

Ответ 4

Возможно, вы сможете избежать определения макроса:

  • #undef
  • избегайте определения в первую очередь (либо с помощью конфигурации, такой как #define NOMINMAX, либо аналогичной или избегающей включения заголовочного заголовка)

Если эти параметры не могут быть использованы или вы не хотите их использовать, всегда можно избежать вызова функционально-подобного макроса с соответствующим использованием парнеров:

#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
}

Это портативно и работает со времен темноты, в начале C.

Ответ 5

Я нашел пару других способов сделать это:

Способ 1:

using std::min;
min(a, b);   // uses either the macro or the function (don't add side effects!)

Способ 2:

#ifndef BOOST_PREVENT_MACRO_SUBSTITUTION
#define BOOST_PREVENT_MACRO_SUBSTITUTION
#endif

...
std::min BOOST_PREVENT_MACRO_SUBSTITUTION(a, b)