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 du compilateur:
#include <limits>
x = std::numeric_limits<int>::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 : '::'
J'obtiens les mêmes résultats avec:
#include <limits>
using namespace std;
x = numeric_limits<int>::max();
Pourquoi voit-il max comme la macro max (a, b); ?
Cela se produit généralement lors de l'inclusion d'un en-tête Windows qui définit une macro min
ou max
. Si vous utilisez des en-têtes Windows, mettez #define NOMINMAX
Dans votre code ou compilez avec le commutateur de compilateur équivalent (c'est-à-dire utilisez / DNOMINMAX pour 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'en-tête <algorithm>
.
Une autre solution serait d'envelopper le nom de la fonction entre parenthèses comme ceci: (std::numeric_limits<int>::max)()
. Il en va de même 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 nom global avec une macro max. Vous pouvez résoudre ce problème en définissant la macro:
#undef max
x = std::numeric_limits<int>::max();
#ifdef max
#pragma Push_macro("max")
#undef max
#define _restore_max_
#endif
#include <limits>
//... your stuff that uses limits
#ifdef _restore_max_
#pragma pop_macro("max")
#undef _restore_max_
#endif
(std :: numeric_limits :: max) ()
C'est de la tarte.
Sa définition pour moi dans Visual Studio 2013 (formatée pour un meilleur espacement ...) est la suivante:
static _Ty (max)() _THROW0()
{ // return maximum value
return (FLT_MAX);
}
Je n'utilise donc que FLT_MAX. :) Ce n'est peut-être pas une solution universelle, mais cela fonctionne bien dans mon cas, j'ai donc pensé partager.