c - near - titlemax app
¿Max(a, b) está definido en stdlib.h o no? (5)
Así que respondiendo a tu pregunta principal:
¿Max (a, b) está definido en stdlib.h o no?
No, no lo es, está definido en windef.h alrededor de la línea 187:
#ifndef NOMINMAX #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif #endif /* NOMINMAX */
Estoy usando dos computadoras, cada una con una versión diferente de Visual Studio. En la computadora visual studio 2008 compila mi código. En la computadora visual 2010, mi código no se compila porque estoy usando la macro max(a,b)
que, por lo que sé, está definida en stdlib.h. No puedo definir max(a,b)
porque será una redefinición en la computadora visual 2008. Pero si no defino max(a,b)
mi código no se compila en la computadora visual 2010.
¿Alguna solución?
Cualquier biblioteca de C que defina una macro llamada max
en sus encabezados estándar se rompe más allá de la imaginación. Afortunadamente, una solución sencilla si necesita admitir dichas plataformas es #undef max
(y cualquier otra macros problemática que defina) después de incluir los encabezados del sistema y antes de cualquiera de sus propios encabezados / código.
Tenga en cuenta que todos los demás están diciendo que #ifndef max ... #endif
su definición en #ifndef max ... #endif
. Esta no es una buena idea Definir el max
en un encabezado del sistema es una indicación de que el implementador era incompetente, y es posible que ciertas versiones del entorno tengan macros incorrectas (por ejemplo, las que no protegen correctamente los argumentos con paréntesis, pero incluso he visto una macro max
¡eso estaba realizando incorrectamente min
lugar de max
al menos una vez en mi vida!). Solo usa #undef
y #undef
seguro.
En cuanto a por qué está tan stdlib.h
para que stdlib.h
defina max
, el estándar C es muy específico sobre qué nombres están reservados para la aplicación y qué nombres están reservados para las funciones estándar y / o el uso interno de la implementación. Hay muy buenas razones para esto. Definir nombres de macros en los encabezados del sistema que podrían entrar en conflicto con los nombres de funciones / variables utilizados en el programa de aplicación es peligroso. En el mejor de los casos, conduce a errores de compilación con una causa obvia, pero en otros casos puede causar un comportamiento muy extraño que es difícil de depurar. En cualquier caso, hace que sea muy difícil escribir código portátil porque nunca se sabe qué nombres ya tomará la biblioteca.
En Visual C ++, si #define NOMINMAX
antes de incluir los encabezados estándar, no obtendrá una macro max
o min
.
Protégelo con un #ifndef
.
#ifndef max
#define max(a,b) ((a) > (b) ? (a) : (b))
#endif
Tenga en cuenta que la versión anterior no es tan segura como una función en línea, por ejemplo, max(a++,b--)
causará resultados inesperados.
Puedes usar la condición compilando:
#ifndef max
#define max(a,b) ...
#endif