Конфликт макросов и функций-членов

У меня проблема в том, что 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

Поместите его сразу после того, как включает в себя

Другие вопросы по тегам