#define NOMINMAX en utilisant std :: min / max

J’ai récemment ajouté:

#define NOMINMAX #include  #include  

à mon main.cpp afin d’utiliser

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

mais je ne peux pas utiliser std::max()/std::min() dans d’autres fichiers.

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

J’ai essayé d’append #define NOMINMAX dans mes autres fichiers, mais cela a échoué. quel est l’indice?

J’ai regardé autour de moi avant de demander, mais je ne comprends pas la réponse Problèmes possibles avec NOMINMAX sous Visual C ++

Si vous êtes vraiment désespéré, mettez des parenthèses autour des noms de fonctions:

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

Cette syntaxe n’appliquera pas une macro de type fonction. (Formellement, pour appliquer une macro de type fonction, le nom de la macro doit être suivi d’un espace facultatif, puis d’un ‘(‘.)

Définissez NOMINMAX via un indicateur de compilation:

 > cl.exe -DNOMINMAX ... 

cela sera alors défini pour tous les fichiers source. Je n’utilise pas les IDE, mais cette page fournit des indications sur la navigation dans l’EDI pour définir ceci: L’ utilisation de STL dans un programme Windows peut provoquer des conflits Min / Max :

Définissez simplement le symbole du préprocesseur NOMINMAX. Cela peut être fait dans le projet Developer Studio sous Génération, Paramètres, sous l’onglet C / C ++, dans la catégorie Préprocesseur. Cela supprimera les définitions min et max dans Windef.h.

Il est probable que votre problème réside dans le fait que vous #define NOMINMAX après avoir #include "windows.h" . Il est important que le #define vienne en premier.

La raison en est que windows.h (en fait, je pense que windef.h, qui est inclus dans windows.h) a un code similaire à celui-ci:

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

Donc #define NOMINMAX dit au compilateur (ou au préprocesseur) de sauter les définitions de min et max , mais cela ne s’appliquera que si vous le faites avant de #include "windows.h" .

Si vous définissez NOMINMAX et que vous préférez la version STL, des problèmes peuvent survenir lors de l’inclusion de gdiplus.h, qui utilise la macro min / max. En tant que solution, vous devez inclure les en-têtes STL et utiliser “using namespace std” avant d’inclure le fichier gdiplus.h.

Par exemple:

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