web-dev-qa-db-fra.com

avertissement C4003 et erreurs C2589 et C2059 sur: x = std :: numeric_limits <int> :: 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 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); ?

56
Harvey

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>.

74
Steve Guidi

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.

62
denis-bu

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();
27
R Samuel Klatchko
#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
dmjalund

(std :: numeric_limits :: max) ()

C'est de la tarte.

0
Mattias Bergmark

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.

0
Andrew