Макрос и конфликт функций-членов
У меня проблема: std:: numeric_limits:: min() конфликтует с макросом "min", определенным в "windef.h". Есть ли способ разрешить этот конфликт без неопределенного макроса "мин".
В приведенной ниже ссылке приведены некоторые подсказки, однако мне не удалось использовать скобки со статической функцией-членом.
Каковы некоторые трюки, которые я могу использовать с макросами?
Спасибо заранее.
Ответы
Ответ 1
Обходной путь заключается в использовании скобки: int max = (numeric_limits<int>::max)();
Он позволяет включать windef.h
, не требует от вас #undef max
(который может иметь неблагоприятные побочные эффекты), и нет необходимости в #define NONIMAX
. Работает как шарм!
Ответ 2
Единственное действительно общее решение - не включать windows.h в заголовки.
Этот заголовок является убийцей и делает все, что может, чтобы ваш код взорвался. Он не будет компилироваться без расширения языковых расширений MSVC, и это худший пример злоупотребления макросами, который я когда-либо видел.
Включите его в один .cpp файл, а затем выложите обертки в заголовок, который может использовать остальная часть вашего кода. Если windows.h не отображается, он не может конфликтовать с вашими именами.
Для случая min/max вы можете #define NOMINMAX
перед включением windows.h. Затем он не будет определять эти конкретные макросы.
Ответ 3
Да, я встречаю ту же проблему. Я нашел только одно решение:
#ifdef min
#undef min
#endif //min
Поместите его прямо после того, как включили.
Ответ 4
В дополнение к jalf-ответу вы также можете #define WINDOWS_LEAN_AND_MEAN
перед включением windows.h. Он избавится от минимальных, максимальных и дополнительных шумов от заголовков окон.
Ответ 5
Dewfy,
Проблема с этим решением заключается в том, если вы хотите использовать макросы после закрытия.
Я даже попытался определить NOMINMAX, но он не сработал.
Лучшим решением, которое я нашел, было то, что было у Йоханнеса Шауба: (std:: numeric_limits:: min)()
Ответ 6
#define NOTHING
int main()
{
int m = -1;
m = max( 0, 1 ); // expands max macro
m = max NOTHING ( 0, 1 ); // error 'max': identifier not found
// functions-like macros are defined as an
// identifier immediately followed by a left
// parenthesis - N3690/16.3/10
m = std::max NOTHING ( 2, 3 ); // NOTHING stops the macro
// expansion (max is not followed by left
// parenthesis): std::max is called
m = (std::max)( 4, 5 ); // the enclosing parenthesis stops the macro
// expansion (max is not followed by left
// parenthesis): std::max is called
return 0;
}