#define NOMINMAX с использованием std:: min/max
Недавно я добавил:
#define NOMINMAX
#include <Windows.h>
#include <algorithm>
на мой main.cpp, чтобы использовать
std::max( x , x ); // x is just a placeholder and not actual anything
std::min( x , x );
но я не могу использовать std::max()/std::min()
в других файлах.
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
Я попытался добавить #define NOMINMAX
в другие мои файлы, но не смог. какова подсказка?
Я огляделся, прежде чем спрашивать, но я не понимаю ответ Возможные проблемы с NOMINMAX на Visual С++
Ответы
Ответ 1
Если вы действительно в отчаянии, поставьте круглые скобки вокруг имен функций:
(std::min)(x, y);
В этом синтаксисе не будет применяться макрос функции. (Формально для применения функционально-подобного макроса имя макроса должно сопровождаться дополнительным пробелом, а затем "(".)
Ответ 2
Определите NOMINMAX
через флаг компилятора:
> cl.exe -DNOMINMAX ...
это будет определено для всех исходных файлов. Я не использую IDE, но на этой странице приведены рекомендации по навигации по IDE, чтобы установить это: Использование STL в программе Windows может вызвать минимальные/максимальные конфликты:
Просто определите символ препроцессора NOMINMAX. Это можно сделать в проекте Developer Studio в разделе "Сборка, настройки" на вкладке "C/С++" в категории "Препроцессор". Это приведет к подавлению минимальных и максимальных определений в Windef.h.
Ответ 3
Вероятно, ваша проблема в том, что вы #define NOMINMAX
после вас #include "windows.h"
. Важно, чтобы #define
появился первым.
Причина в том, что windows.h(на самом деле я думаю, что windef.h, который входит в состав windows.h) имеет код, похожий на этот:
#ifndef NOMINMAX
#define min(x,y) ((x) < (y) ? (x) : (y))
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif
Итак, #define NOMINMAX
сообщает компилятору (или фактически препроцессору) пропустить определения min
и max
, но это применимо только в том случае, если вы сделаете это перед #include "windows.h"
.
Ответ 4
Если вы определяете NOMINMAX, потому что вы предпочитаете STL-версию, тогда у вас могут возникнуть проблемы, включая gdiplus.h, который использует макрос min/max.
В качестве решения вам нужно включить заголовки STL и использовать "using namespace std" до, вы включаете gdiplus.h.
В примере:
#define NOMINMAX
// Include C++ headers
#include <algorithm>
using namespace std;
// Include Windows headers
#include <windows.h>
#include <gdiplus.h>