avertissement C4003 et erreurs C2589 et C2059 on: x = std:: limites numériques: max();
cette ligne fonctionne correctement dans un petit programme de test, mais dans le programme pour lequel je la veux, je reçois les plaintes de compilateur suivantes:
#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 le macro max(a,b); ?
5 réponses
cela se produit couramment lorsque L'on inclut 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 construisez avec le commutateur de compilateur équivalent (i.e. utilisez /DNOMINMAX pour Visual Studio).
notez que la construction avec NOMINMAX
empêche 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()
de la <algorithm>
en-tête.
une autre solution serait d'envelopper le nom de la fonction avec des 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 ça... NOMINMAX est mieux IMO, mais cela pourrait être une option dans certains cas.
un autre fichier d'en-tête pollue l'espace du nom global avec une macro max. Vous pouvez corriger cela en désactivant 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
sa définition dans pour moi Dans Visual Studio 2013 (formaté pour un meilleur espacement...) est le suivant:
static _Ty (max)() _THROW0()
{ // return maximum value
return (FLT_MAX);
}
donc J'utilise FLT_MAX. :) C'est peut-être pas une solution universelle, mais il fonctionne bien dans mon cas, j'ai donc pensé que je voudrais partager.