Определение функции переопределения макроса препроцессора в переполнении стека

Я достаточно хорошо знаком с основами C ++, но у меня нет опыта (в основном кода на Java), поэтому немного «тупые» ответы будут приветствоваться 🙂

Я расширяю более крупный проект с открытым исходным кодом, в котором используется стандартный класс Visual Studio limit.h, где можно найти следующий код:

template<> class numeric_limits<double>
: public _Num_float_base
{   // limits for type double
public:
typedef double _Ty;

static _Ty (max)() _THROW0()
{   // return maximum value
return (DBL_MAX);
}

Теперь я импортировал другой проект с открытым исходным кодом, который использует minwindef.h, в котором есть этот фрагмент кода:

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

Сборка теперь ломается, потому что для этой строки

SUMOReal distance = std::numeric_limits<SUMOReal>::max();

компилятор жалуется на использование max () без каких-либо параметров.
Есть ли быстрый способ обойти эту проблему, или я могу просто не использовать импортированную библиотеку? : /

Надеюсь, это было достаточно ясно, спасибо за любые предложения!

3

Решение

В настройках компилятора есть NOMINMAX быть определенным. Это остановит заголовки Windows от попыток определить min а также max макросы. Это правильный способ справиться с этой проблемой; пытаясь #undef это ненадежно и подвержено ошибкам. Ищи NOMINMAX для получения дополнительной информации об этом флаге.

Вы также можете сделать это в крайнем случае, но не делайте это привычкой:

SUMOReal distance = (std::numeric_limits<SUMOReal>::max)();
2

Другие решения

Единственный способ обойти проблему — #undef макрос.

Это одна из причин того, что макросы традиционно пишутся со всеми буквами UPPER_CASE, тогда как системные и стандартные функции пишутся строчными буквами.

3

Вы можете запретить препроцессор C ++ для расширения max макрос для конкретной строки кода и затем включить его после строки. Это решение не повлияет на другие части кода (то есть, если макрос max нужен где-то еще)

#pragma push_macro("max")
#undef max
SUMOReal distance = std::numeric_limits<SUMOReal>::max();
#pragma pop_macro("max")
3
По вопросам рекламы [email protected]