Конфликт макросов и функций-членов
У меня проблема в том, что std::numeric_limits::min() конфликтует с макросом "min", определенным в "windef.h". Есть ли способ разрешить этот конфликт, не определяя макрос "min". Ссылка ниже дает некоторые подсказки, однако мне не удалось использовать скобки со статической функцией-членом.
Какие уловки я могу использовать с макросами?
Заранее спасибо.
5 ответов
Обходной путь должен использовать круглые скобки: int max = (numeric_limits<int>::max)();
Это позволяет вам включать windef.h
, не требует от вас #undef max
(что может иметь неблагоприятные побочные эффекты), и нет необходимости #define NONIMAX
, Работает как шарм!
Единственное действительно общее решение - не включать windows.h в ваши заголовки.
Этот заголовок является убийцей, и делает все возможное, чтобы ваш код взорвался. Он не скомпилируется без включенных языковых расширений MSVC, и это худший пример злоупотребления макросами, который я когда-либо видел.
Включите его в один файл.cpp, а затем предоставьте обертки в заголовке, которые может использовать остальная часть вашего кода. Если windows.h не отображается, он не может конфликтовать с вашими именами.
Для случая мин / макс, в частности, вы можете #define NOMINMAX
перед включением windows.h. Тогда он не будет определять эти конкретные макросы.
В дополнение к ответу Джальфа, вы также можете #define WINDOWS_LEAN_AND_MEAN
перед включением windows.h. Это избавит от мин, макс и еще немного шума от заголовков окон.
Dewfy, проблема с этим решением заключается в том, что если вам нужно использовать макро-верфи.
Я даже попробовал определить NOMINMAX, но это не сработало.
Лучшее решение, которое я нашел, было от Johannes Schaub: (std::numeric_limits::min)()
Да, я столкнулся с той же проблемой. Я нашел только одно решение:
#ifdef min
#undef min
#endif //min
Поместите его сразу после того, как включает в себя