Как мне позвонить std::min
, когда min
уже определен как макрос?
Как вызвать std:: min(), когда min был определен как макрос?
Ответ 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)