2009-12-15 16 views
55

Esta línea funciona correctamente en un programa de prueba pequeña, pero en el programa para el que lo quiero, me sale el siguiente quejas del compilador:advertencia C4003 y errores C2589 y C2059 en: x = std :: numeric_limits <int> :: max();

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

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

+0

En mi caso, sin el '-DNOMINMAX' estaba obteniendo un error de compilador interno. Es divertido ver cómo Microsoft lucha constantemente contra sí mismo. –

Respuesta

74

Esto suele ocurrir cuando se incluye una cabecera de Windows que define un min o max macro. Si usa encabezados de Windows, ingrese #define NOMINMAX en su código o compilación con el compilador equivalente (es decir, use /DNOMINMAX para Visual Studio).

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

+0

De acuerdo, solo tengo que preguntar ... ¿Puedo tener ambas en el mismo archivo? x = std :: numeric_limits :: max(); // un complicado comando de preprocesador c = max (a, b); – Harvey

+0

@Harvey: He editado mi respuesta para abordar el uso de max() y macro max() en un archivo. –

+0

Utilizo min() y max() en otros archivos en este proyecto y usando encabezados precompilados, está deshabilitado para todos los archivos. #undef max funciona para mi caso y solo es efectivo para el resto del archivo. – Harvey

27

Algún otro archivo de cabecera está contaminando el espacio de nombre global con una macro máxima. Se puede arreglar eso por undefining la macro:

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

No lo arregles de esta manera, puedes evitar que se defina en primer lugar con 'NOMINMAX'. – GManNickG

61

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

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

+1

Por mucho que odie el uso de las macros min/max globales, a veces es complicado eliminarlas por completo de un proyecto. Nunca pensé en esto como una solución, así que +1. – icabod

+6

Desafortunadamente, las macros min y max se usan ampliamente en Windows Platform SDK (por ejemplo, en GDI + GdiplusTypes.h). Entonces, tu respuesta es mejor que definir NOMINMAX. +1! – 23W

+0

¿Cómo ayuda la envoltura aquí? realmente confundido, ¿puedes explicar un poco? – sami1592

3
#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 
+0

@MattMcNabb Lo cambié – dmjalund

0

su definición en para mí en Visual Studio 2013 (con formato para una mejor separación ...) es como sigue:

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

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

+1

Ten cuidado, puedes (es) necesitar '#include ' para acceder a 'FLT_MAX' –

Cuestiones relacionadas