numeric_limits c++ visual-c++ max numeric-limits

c++ - advertencia C4003 y errores C2589 y C2059 en: x=std:: numeric_limits<int>:: max();



c++ int max value (5)

Algún otro archivo de cabecera está contaminando el espacio de nombre global con una macro máxima. Puede solucionar eso al undefinir la macro:

#undef max x = std::numeric_limits<int>::max();

Esta línea funciona correctamente en un pequeño programa de prueba, pero en el programa para el que quiero, obtengo las siguientes quejas del compilador:

#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 : ''::''

Obtengo los mismos resultados con:

#include <limits> using namespace std; x = numeric_limits<int>::max();

¿Por qué se ve max como la macro max (a, b); ?


Esto ocurre comúnmente cuando se incluye un encabezado de Windows que define una macro min o max . Si usa los encabezados de Windows, coloque #define NOMINMAX en su código, o compilación con el compilador equivalente (es decir, utilice / DNOMINMAX para Visual Studio).

Tenga en cuenta que construir con NOMINMAX desactiva el uso de la macro en todo su programa. Si necesita usar las operaciones min O max , std::min() o std::max() desde el encabezado <algorithm> .


Otra solución sería envolver el nombre de la función con paréntesis como este: (std::numeric_limits<int>::max)() . Lo mismo se aplica a std::max .

No estoy seguro de que sea una buena solución para esto ... NOMINMAX es mejor IMO, pero esta podría ser una opción en algunos casos.


Su definición en mí en Visual Studio 2013 (formateada para un mejor espaciado ...) es la siguiente:

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

Entonces solo estoy usando FLT_MAX. :) Esta puede no ser una solución universal, pero funciona bien en mi caso, así que pensé en compartirla.


#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