avertissement C4003 et erreurs C2589 et C2059 sur: x = std :: numeric_limits :: max ();

Cette ligne fonctionne correctement dans un petit programme de test, mais dans le programme pour lequel je le souhaite, je reçois les plaintes suivantes concernant le compilateur:

#include  x = std::numeric_limits::max(); c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max' c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::' c:\...\x.cpp(192) : error C2059: syntax error : '::' 

Je reçois les mêmes résultats avec:

 #include  using namespace std; x = numeric_limits::max(); 

Pourquoi voit-il max comme la macro max (a, b); ?

Cela se produit généralement lorsque vous incluez un en-tête Windows qui définit une macro min ou max . Si vous utilisez les en-têtes Windows, placez #define NOMINMAX dans votre code ou créez- le avec le commutateur de compilation équivalent (utilisez / DNOMINMAX for Visual Studio).

Notez que la construction avec NOMINMAX désactive l’utilisation de la macro dans l’ensemble de votre programme. Si vous devez utiliser les opérations min ou max , utilisez std::min() ou std::max() partir de l’ tête .

Une autre solution serait d’envelopper le nom de la fonction avec des parenthèses comme ceci: (std::numeric_limits::max)() . Même chose pour std::max .

Pas sûr que ce soit une bonne solution pour cela … NOMINMAX est mieux IMO, mais cela pourrait être une option dans certains cas.

Un autre fichier d’en-tête pollue l’espace de noms global avec une macro max. Vous pouvez résoudre ce problème en supprimant la macro:

 #undef max x = std::numeric_limits::max(); 
 #ifdef max #pragma push_macro("max") #undef max #define _restore_max_ #endif #include  //... your stuff that uses limits #ifdef _restore_max_ #pragma pop_macro("max") #undef _restore_max_ #endif 

Sa définition dans Visual Studio 2013 (formatée pour un meilleur espacement …) est la suivante:

 static _Ty (max)() _THROW0() { // return maximum value return (FLT_MAX); } 

Donc, j’utilise simplement FLT_MAX. 🙂 Ce n’est peut-être pas une solution universelle, mais ça marche bien dans mon cas, alors j’ai pensé partager.