Мешают define макросы min и max
Я программирую в среде Visual Studio 2017 на C++14.
Проблема в том, что когда я пишу std::min и std::max, я получаю сообщение от компилятора "Требуется идентификатор". Это возникает из-за define, который подставляет вместо имён функций другой код.
Я использую библиотеки glad и glfw3 для работы с OpenGL, а сам define лежит в minwindef.h
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
Мне не хочется, чтобы этот define применялся к моему коду. Что я могу сделать?
Ответы (2 шт):
Начните программу со строки
#define NOMINMAX
Она отменяет макросы min и max в стандартных заголовочных файлах Windows.
Есть несколько способов решения проблемы макросов min, max в заголовочных файлах Windows.
Использовать
#define NOMINMAXв коде перед явным или косвенным включением заголовочного файла с определением макросовmin,max.Иногда бывает не сразу очевидно, где именно стоит добавлять
#define NOMINMAX, например, если добавление, казалось бы, в правильном месте не решает проблему. Тогда можно попробовать определитьNOMINMAXчерез дополнительный ключ компилятора:> cl.exe -DNOMINMAX ...В Visual Studio это делается через Configuration Properties → C/C++ → Preprocessor → Preprocessor Definitions в свойствах проекта.
При одновременном использовании библиотек, опирающихся на наличие функционала макросов
min,max, предыдущее решение может вызывать проблемы типа:error C3861: 'min': identifier not found
В таком случае можно дополнить первое решение внесением стандартных функций
std::min,std::maxв проблемное пространство имён (откуда возникла ошибка "identifier not found"). Например:#define NOMINMAX #include <algorithm> namespace Gdiplus { using std::min; using std::max; }Макросы
min,maxможно вовсе не отменять, а вызовыstd::minиstd::maxобернуть в скобки:(std::min)(x, y);В таком виде макроподстановка не выполняется, т.к. для этого требуется иметь открывающую скобку (с возможными пробельными символами) сразу за потенциальным функциональным макросом, а мы это блокировали наличием закрывающей скобки.
Локально отменить макрос и после вызова функции вернуть с помощью
push_macro/pop_macro:max(x, y); // Подстановка макроса #pragma push_macro("max") #undef max std::max(x, y); // Вызов функции #pragma pop_macro("max") max(x, y); // Снова подстановка макроса
