advertencia C4003 y errores C2589 y C2059 en: x = std:: límites numéricos: max();


Esta línea funciona correctamente en un pequeño programa de prueba, pero en el programa para el que lo 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é está viendo max como la macro max(a,b); ?

Author: Phil Miller, 2009-12-15

5 answers

Esto ocurre comúnmente cuando se incluye un encabezado de Windows que define una macro min o max. Si está usando encabezados de Windows, ponga #define NOMINMAX en su código, o compile con el conmutador de compilador equivalente (es decir, use /DNOMINMAX para Visual Studio).

Tenga en cuenta que la compilación con NOMINMAX deshabilita el uso de la macro en todo el programa. Si necesita usar las operaciones min o max, use std::min() o std::max() desde el encabezado <algorithm>.

 74
Author: Steve Guidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-15 01:42:34

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 esto podría ser una opción en algunos casos.

 62
Author: denis-bu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-26 14:02:06

Algún otro archivo de encabezado está contaminando el espacio de nombres global con una macro max. Puedes arreglarlo deshaciendo la macro:

#undef max
x = std::numeric_limits<int>::max();
 27
Author: R Samuel Klatchko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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
Author: dmjalund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-26 21:25:18

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

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

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

 0
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-15 23:01:05