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); ?

56
demandé sur Phil Miller 2009-12-15 04:08:28

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.

74
répondu Steve Guidi 2009-12-15 01:42:34

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.

62
répondu denis-bu 2012-11-26 14:02:06

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();
27
répondu R Samuel Klatchko 2009-12-15 01:11:51
#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
3
répondu dmjalund 2015-01-26 21:25:18

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.

0
répondu Andrew 2015-05-15 23:01:05