Возможные проблемы с NOMINMAX на Visual C ++ - PullRequest
33 голосов
/ 06 февраля 2011

Какие проблемы могут возникнуть при определении NOMINMAX перед чем-либо еще в моей программе?

Насколько я знаю, это заставит <Windows.h> не определять макросы min и max такимичто многие конфликты с STL, например std::min(), std::max() или std::numeric_limits<T>::min(), разрешены.

Прав ли я в предположении, что только специфичный для Windows и унаследованный код будет иметь проблемы?Почти все библиотеки не должны зависеть от min() и max(), определенных как макросы?

Редактировать: Будут ли проблемы с другими заголовками Windows?

Ответы [ 4 ]

53 голосов
/ 06 февраля 2011

Использование NOMINMAX - единственный не совсем злой способ включить <windows.h>. Вы также должны определить UNICODE и STRICT. Хотя последний определяется по умолчанию современными реализациями.

Однако вы можете столкнуться с проблемами с заголовками Microsoft, например, для GdiPlus. Мне не известно о проблемах с заголовками каких-либо других компаний или лиц.

Если заголовок определяет пространство имен, как это делает GdiPlus, то одним из исправлений является создание оболочки для соответствующего заголовка, куда вы включаете <algorithm> и внутри пространства имен заголовка using namespace std; (или, альтернативно, * 1011). * и using std::max):

#define NOMINMAX
#include <algorithm>
namespace Gdiplus
{
  using std::min;
  using std::max;
}

Обратите внимание, что это очень отличается от using namespace std; в глобальной области видимости в заголовке, который никогда не должен делать .

Я надеваю & Rsquo; знают любое хорошее обходной для случая, когда нет никакого пространства имен, но, к счастью, я гавань и Rsquo;. Т запустить в это, поэтому на практике, что конкретная проблема, вероятно, спорная вопросом

13 голосов
/ 10 апреля 2013

Я обычно использую NOMINMAX, чтобы ограничить потенциальные побочные эффекты:

#define NOMINMAX
#include <windows.h>
#undef NOMINMAX

Таким образом, область действия NOMINMAX относительно ограничена.

Это не идеальныйрешение.Если что-то еще уже определено NOMINMAX, этот шаблон не работает (хотя я никогда не сталкивался с таким случаем).

Если вы хотите быть очень, очень осторожным, тогда вы можете #include заголовок оболочки везде, гдевы бы включили #incindows.h.Оболочка будет выглядеть примерно так:

/* Include this file instead of including <windows.h> directly. */
#ifdef NOMINMAX
#include <windows.h>
#else
#define NOMINMAX
#include <windows.h>
#undef NOMINMAX
#endif

Вы можете себе представить, что в обёртке можно делать и другие вещи, например, принудительное выполнение UNICODE и / или STRICT.

.
0 голосов
/ 23 июня 2017

Я получил исправленную проблему, объявив заголовки и пространства имен в следующем порядке:

#include <windows.h>
#include <minmax.h>
#include <gdiplus.h>

using namespace Gdiplus;
using namespace std;
0 голосов
/ 17 сентября 2015

Для предварительно скомпилированного заголовка (например, stdafx.h) я использую это:

#define NOMINMAX
#include <algorithm>
#include <Windows.h>
#ifndef min
#define min(x,y) ((x) < (y) ? (x) : (y))
#endif
#ifndef max
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif
#include <gdiplus.h>
#undef min
#undef max
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...