Подтвердить что ты не робот

#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 С++

4b9b3361

Ответ 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>