#definisci NOMINMAX usando std :: min / max

ho aggiunto di recente:

#define NOMINMAX #include  #include  

al mio main.cpp per poter utilizzare

 std::max( x , x ); // x is just a placeholder and not actual anything std::min( x , x ); 

ma non posso usare std::max()/std::min() in altri file.

 error C2589: '(' : illegal token on right side of '::' error C2059: syntax error : '::' 

Ho provato ad aggiungere #define NOMINMAX nei miei altri file, ma fallisce. qual è la chiave?

Mi sono guardato intorno prima di chiedere, ma non capisco la risposta Possibili problemi con NOMINMAX su Visual C ++

Se sei davvero disperato, metti parentesi attorno ai nomi delle funzioni:

 (std::min)(x, y); 

Questa syntax non applicherà una macro simile alla funzione. (Formalmente, per applicare una macro simile alla funzione, il nome della macro deve essere seguito da uno spazio bianco opzionale seguito da un ‘(‘.)

Definisci NOMINMAX tramite un flag del compilatore:

 > cl.exe -DNOMINMAX ... 

questo sarà quindi definito per tutti i file sorgente. Non utilizzo gli IDE ma questa pagina fornisce indicazioni sulla navigazione dell’IDE per impostarla: L’ utilizzo di STL nel programma Windows può causare conflitti min / max :

Basta definire il simbolo del preprocessore NOMINMAX. Questo può essere fatto nel progetto Developer Studio sotto Build, Settings, nella scheda C / C ++, nella categoria Preprocessore. Ciò sopprimerà le definizioni min e max in Windef.h.

È probabile che il tuo problema sia che #define NOMINMAX dopo aver #include "windows.h" . È importante che #define venga prima.

Il motivo è che windows.h (in realtà penso che windef.h, incluso in windows.h) abbia un codice simile a questo:

 #ifndef NOMINMAX #define min(x,y) ((x) < (y) ? (x) : (y)) #define max(x,y) ((x) > (y) ? (x) : (y)) #endif 

Quindi #define NOMINMAX sta dicendo al compilatore (o addirittura al preprocessore) di saltare le definizioni di min e max , ma si applica solo se lo fai prima di #include "windows.h" .

Se si definisce NOMINMAX, poiché si preferisce la versione STL, potrebbero verificarsi problemi durante l’inclusione di gdiplus.h, che utilizza la macro min / max. Come soluzione è necessario includere le intestazioni STL e utilizzare “using namespace std” prima di includere gdiplus.h.

Per esempio:

 #define NOMINMAX // Include C++ headers #include  using namespace std; // Include Windows headers #include  #include