Posibles problemas con NOMINMAX en Visual C ++

¿Qué problemas podría tener al definir NOMINMAX antes que cualquier otra cosa en mi progtwig?

Por lo que yo sé, esto hará que no defina las macros max y max manera que muchos conflictos con el STL, por ejemplo, std::min() , std::max() o std::numeric_limits::min() están resueltos.

¿Estoy en lo cierto al suponer que solo el código heredado y heredado de Windows tendrá problemas? ¿Casi todas las bibliotecas no deberían depender de min() y max() definidas como macros?

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

Usar NOMINMAX es la única forma no completamente malvada de incluir . 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, por ejemplo, para GdiPlus. No estoy al tanto de problemas con los encabezados de otras compañías o personas.

Si el encabezado define un espacio de nombre, como lo hace GdiPlus, entonces una solución es crear un contenedor para el encabezado relevante, donde se incluye , y dentro del espacio de nombres del encabezado, using namespace std; (o alternativamente using std::min; y using std::max ):

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

Tenga en cuenta que eso es muy diferente de using namespace std; en scope global en el encabezado, lo que nunca debería hacer .

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

Generalmente uso NOMINMAX esta manera para limitar los posibles efectos secundarios:

 #define NOMINMAX #include  #undef NOMINMAX 

De esta forma, el scope del NOMINMAX es relativamente limitado.

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, puedes #incluir un encabezado contenedor donde sea que tengas #incluido windows.h. El contenedor sería algo como esto:

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

También podría imaginar hacer otras cosas en el envoltorio, como aplicar UNICODE y / o STRICT .

Para el encabezado precomstackdo (como stdafx.h) uso esto:

 #define NOMINMAX #include  #include  #ifndef min #define min(x,y) ((x) < (y) ? (x) : (y)) #endif #ifndef max #define max(x,y) ((x) > (y) ? (x) : (y)) #endif #include  #undef min #undef max 

Recibí el problema de la solución al declarar los encabezados y los espacios de nombres en el siguiente orden:

 #include  #include  #include  using namespace Gdiplus; using namespace std;