Как вызвать std :: min (), когда min был определен как макрос? - PullRequest
35 голосов
/ 16 сентября 2011

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

Ответы [ 5 ]

82 голосов
/ 16 сентября 2011
(std::min)(x,y)

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

15 голосов
/ 16 сентября 2011

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

6 голосов
/ 16 сентября 2011

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

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

// rest f code.

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

4 голосов
/ 16 сентября 2011

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

  • #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.

2 голосов
/ 17 января 2013

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

Метод 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...