windows - Mulige problemer med NOMINMAX på Visual C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Hvilke problemer kan jeg få, når jeg definerer NOMINMAX før noget andet i mit program?


Så vidt jeg ved, vil dette gøre <Windows.h> ikke definere makroerne min og max, så mange konflikter med STL, f.eks. std::min(), std::max() eller std::numeric\_limits<T>::min() er løst.


Har jeg ret i antagelsen om, at kun Windows-specifikke og arvskode vil have problemer?
Næsten alle biblioteker bør ikke afhænge af min() og max() defineret som makroer?


 Vil der være problemer med andre Windows-overskrifter?

Bedste reference


Brug af NOMINMAX er den eneste ikke fuldstændig onde måde at inkludere <windows.h> til. Du skal også definere UNICODE og STRICT. Selv om sidstnævnte er defineret som standard ved moderne implementeringer.


Du kan dog løbe ind i problemer med Microsofts overskrifter, f.eks. for GdiPlus. Jeg er ikke opmærksom på problemer med overskrifter fra andre firmaer eller personer.


Hvis overskriften definerer et navneområde, som GdiPlus gør, er en rettelse at skabe en indpakning for den relevante overskrift, hvor du indbefatter <algorithm> og inde i overskriftsnavnet, using namespace std; (eller alternativt [[using std::min; og using std::max):


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


Bemærk, at det er meget forskelligt fra en using namespace std; på globalt plan i overskriften, som aldrig skal gøre .


Jeg kender ikke til nogen god løsning for sagen, hvor der ikke er navneområde, men heldigvis har jeg ikke kørt ind i det, så i praksis er det bestemt problem sandsynligvis meget.

Andre referencer 1


Jeg bruger generelt NOMINMAX som denne for at begrænse de potentielle bivirkninger:


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


På denne måde er omfanget af NOMINMAX relativt begrænset.


Det er ikke en perfekt løsning. Hvis noget andet allerede har defineret NOMINMAX, fejler dette mønster (selvom jeg aldrig har oplevet en sådan sag).


Hvis du vil være virkelig, virkelig forsigtig, så kan du # inkludere en wrapper header, hvor du vil have # inkluderet windows.h. Indpakningen ville gå noget som dette:


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


Du kan forestille dig at gøre andre ting i indpakningen, ligesom at håndhæve UNICODE og/eller STRICT.

Andre referencer 2


For forkompileret header (som stdafx.h) bruger jeg dette:


#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

Andre referencer 3


Jeg fik fix problem ved at erklære overskrifter og navneområder i følgende rækkefølge:


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

using namespace Gdiplus;
using namespace std;