web-dev-qa-db-fra.com

#define NOMINMAX en utilisant std :: min / max

j'ai récemment ajouté:

#define NOMINMAX
#include <Windows.h>
#include <algorithm>

à 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'ajouter #define NOMINMAX dans mes autres fichiers, mais échoue. quel est l'indice?

j'ai regardé autour avant de demander, mais je ne comprends pas la réponse Problèmes possibles avec NOMINMAX sur Visual C++

29
NaturalDemon

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

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

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

72
Pete Becker

Définissez NOMINMAX via un drapeau 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 conseils sur la navigation dans le IDE pour définir ceci: L'utilisation de STL dans le 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 Build, Settings, sous l'onglet C/C++, dans la catégorie Preprocessor. Cela supprimera les définitions min et max dans Windef.h.

23
hmjd

Si vous définissez NOMINMAX, car vous préférez la version STL, vous pouvez rencontrer des problèmes lors de l'inclusion de gdiplus.h, qui utilise la macro min/max. Comme solution, vous devez inclure les en-têtes STL et utiliser "using namespace std" before vous incluez le gdiplus.h.

Par exemple:

#define NOMINMAX

// Include C++ headers
#include <algorithm>
using namespace std;

// Include Windows headers
#include <windows.h>
#include <gdiplus.h>
8
David Gausmann

Il est probable que votre problème soit que vous #define NOMINMAX Après Vous #include "windows.h". Il est important que le #define viens en premier.

La raison en est que windows.h (en fait je pense que windef.h, qui est inclus par windows.h) a un code similaire à ceci:

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

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

5
Tom