Я достаточно хорошо знаком с основами 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 () без каких-либо параметров.
Есть ли быстрый способ обойти эту проблему, или я могу просто не использовать импортированную библиотеку? : /
Надеюсь, это было достаточно ясно, спасибо за любые предложения!
В настройках компилятора есть NOMINMAX
быть определенным. Это остановит заголовки Windows от попыток определить min
а также max
макросы. Это правильный способ справиться с этой проблемой; пытаясь #undef
это ненадежно и подвержено ошибкам. Ищи NOMINMAX
для получения дополнительной информации об этом флаге.
Вы также можете сделать это в крайнем случае, но не делайте это привычкой:
SUMOReal distance = (std::numeric_limits<SUMOReal>::max)();
Единственный способ обойти проблему — #undef
макрос.
Это одна из причин того, что макросы традиционно пишутся со всеми буквами UPPER_CASE, тогда как системные и стандартные функции пишутся строчными буквами.
Вы можете запретить препроцессор C ++ для расширения max
макрос для конкретной строки кода и затем включить его после строки. Это решение не повлияет на другие части кода (то есть, если макрос max
нужен где-то еще)
#pragma push_macro("max")
#undef max
SUMOReal distance = std::numeric_limits<SUMOReal>::max();
#pragma pop_macro("max")