2011-02-06 14 views
28

¿Qué problemas podría tener al definir NOMINMAX antes que cualquier otra cosa en mi programa?Posibles problemas con NOMINMAX en Visual C++

Por lo que yo sé, esto hará que <Windows.h> no define el min y max macros tal que muchos conflictos con el STL, por ejemplo, std::min(), std::max() o std::numeric_limits<T>::min() se resuelven.

¿Estoy en el supuesto de que solo el código heredado y heredado de Windows tendrá problemas? ¿Casi todas las bibliotecas no deben depender de min() y max() definidas como macros?

Editar: ¿Habrá problemas con otros encabezados de Windows?

+1

No debería haber problemas, incluso con código específico de Windows, pero es posible que existe algún código que no funcionaría. ¿Por qué no lo intentas y ves si hay algún error? –

+0

Para nuestro código interno, 'NOMINMAX' funciona bien. Sin embargo, la biblioteca también es utilizada por desarrolladores externos y no quiero romper sus aplicaciones. – Manuel

+1

'# define' es una operación en tiempo de compilación. Las bibliotecas están enlazadas, no compiladas. Esto significa que pueden tener sus propios '# define' independientes. Los usuarios de la biblioteca no verán que '# define'd' NOMINMAX' – MSalters

Respuesta

47

El uso de NOMINMAX es la única forma no completamente incorrecta de incluir <windows.h>. También debe definir UNICODE y STRICT. Aunque este último está definido por defecto por implementaciones modernas.

Sin embargo, puede tener problemas con los encabezados de Microsoft ’ s, p. para GdiPlus. I ’ m no tiene conocimiento de problemas con los encabezados de otras empresas o personas.

Si la cabecera define un espacio de nombres, al igual que GdiPlus, entonces una solución es crear un contenedor para el encabezado correspondiente, donde se incluye <algorithm>, y dentro de la cabecera ’ s espacio de nombres, using namespace std; (o alternativamente using std::min; y using std::max):

#define NOMINMAX 
#include <algorithm> 
namespace Gdiplus 
{ 
    using std::min; 
    using std::max; 
} 

Tenga en cuenta que esto es muy diferente de un using namespace std; en el ámbito global en la cabecera, lo que debería hacer Nunca.

No sé de ninguna buena solución para el caso en que no hay espacio de nombres, pero felizmente no he encontrado ’, así que en la práctica ese problema en particular es probablemente discutible.

+1

¿Entonces para GdiPlus, el problema puede solucionarse? – Manuel

+1

@Manuel: sí, al parecer. Tengo que incluir la calificación con la palabra comadreja "aparentemente" porque aunque funciona muy bien para lo que he hecho, no puedo garantizar que no haya algún mal código GdiPlus que no haya ejercido. Algun lado. –

+0

Otra solución es simplemente 'ir' del 'min',' max' de STL y dejar que el compilador use 'min',' max' de Windef.h para sus proyectos GDIPlus. No es un gran trato. – bobobobo

11

I utilizan generalmente NOMINMAX como este para limitar los efectos secundarios potenciales:

#define NOMINMAX 
#include <windows.h> 
#undef NOMINMAX 

De esa manera el alcance de la NOMINMAX está relativamente confinado.

No es una solución perfecta. Si algo más ya ha definido NOMINMAX, este patrón falla (aunque nunca he encontrado tal caso).

Si quieres ser muy, muy cuidadoso, entonces puedes #incluir un encabezado contenedor donde sea que tengas #incluido windows.h. La envoltura sería algo como esto:

/* Include this file instead of including <windows.h> directly. */ 
#ifdef NOMINMAX 
#include <windows.h> 
#else 
#define NOMINMAX 
#include <windows.h> 
#undef NOMINMAX 
#endif 

que se puedan imaginar haciendo otras cosas en el envoltorio, también, como la aplicación de UNICODE y/o STRICT.

0

Para encabezado precompilado (como stdafx.h) Uso este:

#define NOMINMAX 
#include <algorithm> 
#include <Windows.h> 
#ifndef min 
#define min(x,y) ((x) < (y) ? (x) : (y)) 
#endif 
#ifndef max 
#define max(x,y) ((x) > (y) ? (x) : (y)) 
#endif 
#include <gdiplus.h> 
#undef min 
#undef max 
0

llegué tema del arreglo al declarar las cabeceras y los espacios de nombres en el siguiente orden:

#include <windows.h> 
#include <minmax.h> 
#include <gdiplus.h> 

using namespace Gdiplus; 
using namespace std; 
Cuestiones relacionadas