Est max(a,b) défini dans stdlib.h ou pas?
Je suis l'aide de deux ordinateurs, chacun avec une autre version de visual studio. Sur visual studio 2008 ordinateur mon code compile. Sur le visual 2010 ordinateur mon code ne compile pas parce que je suis en utilisant la macro max(a,b)
qui, autant que je sais, c'est défini dans stdlib.h. Je ne peux pas il suffit de définir max(a,b)
parce que ça va être une redéfinition sur le visual 2008 ordinateur. Mais si je ne définissent pas max(a,b)
mon code ne compile pas sur le visual 2010 ordinateur.
Toute solution?
En dehors de la portabilité des problèmes abordés dans la accepté de répondre, je suis curieux de savoir pourquoi vous avez des problèmes avec le déplacement du code à l'aide de la
Sur mon Visual C la stdlib.h définit
stackoverflow.com/questions/3437404/min-and-max-in-c
Dans visual studio 2015, min et max sont toujours définis dans stdlib.h...
max()
macro à partir de VS2008 à VS2010. max()
est défini dans VS2010 de stdlib.h
de la même manière qu'il est dans VS2008 (il y a des options qui s'éteint à la définition, mais ils sont les mêmes dans les deux compilateurs). En d'autres termes, il y a quelque chose de plus que le passage de VS2008 à VS2010 (et que max()
en cours de définition dans stdlib.h
est non-standards conformes) qui a provoqué ce problème pour vous.Sur mon Visual C la stdlib.h définit
__min
et __max
.stackoverflow.com/questions/3437404/min-and-max-in-c
Dans visual studio 2015, min et max sont toujours définis dans stdlib.h...
OriginalL'auteur snakile | 2010-11-20
Vous devez vous connecter pour publier un commentaire.
Toute bibliothèque C qui définit une macro nommée
max
dans ses en-têtes standard est cassé au-delà de l'imagination. Heureusement, une simple solution de contournement si vous avez besoin à l'appui de ces plates-formes est de#undef max
(et toute autre problématique, les macros définit) après, y compris le système d'en-têtes et avant tout de vos propres en-têtes/code.Remarque que tout le monde est en train de dire à envelopper votre définition dans
#ifndef max ... #endif
. C'est pas une bonne idée. La définition demax
dans un système d'en-tête est une indication que le réalisateur était incompétent, et il est possible que certaines versions de l'environnement ont incorrect macros (par exemple, ceux qui ne sont pas de protéger correctement les arguments entre parenthèses, mais j'ai même vu unemax
macro qui fonctionne incorrectementmin
au lieu demax
au moins une fois dans ma vie!). Utilisez simplement#undef
et être en sécurité.Comme pour pourquoi il est rompu pour
stdlib.h
de définirmax
, la norme C est très précis sur ce que les noms sont réservés pour l'application et quels noms sont réservés pour les fonctions standard et/ou à un usage interne par la mise en œuvre. Il y a de très bonnes raisons pour cela. La définition de la macro noms dans le système des en-têtes qui pourraient se heurter à de variable, de fonction, de noms utilisés dans le programme d'application est dangereux. Dans le meilleur des cas, elle conduit à des erreurs de compilation avec un motif évident, mais dans d'autres cas, il peut causer un comportement très étrange qui est difficile à déboguer. En tout cas c'est très difficile d'écrire du code portable parce que vous ne savez jamais ce que les noms seront déjà prises par la bibliothèque.Merci, mais pouvez-vous m'expliquer pourquoi une bibliothèque C qui définit max est cassé au-delà de l'imagination?
Ajout d'une brève explication.
Vos commentaires sur pourquoi
<stdlib.h>
ne devrait pas définirmax
sont valables jusqu'à un certain point. Si l'utilisateur fait explicitement la demande supplémentaire définitions de la mise en œuvre (par exemple, la définition__EXTENSIONS__
(non officiel), ou_POSIX_C_SOURCE
(officiel)), alors il est permis de<stdlib.h>
pour plus de définitions. Et sur de nombreuses plates-formes, les extensions peuvent être activées par défaut, et seulement rendu indisponible par demandant 'standard conforme à la mode".il est également vrai, cependant, que la définition d'inattendu macros est plus difficile sur les programmeurs que de définir inattendu fonctions. Les erreurs du compilateur (le cas échéant) sont moins susceptibles de faire beaucoup de sens.
OriginalL'auteur R..
De la protéger avec un
#ifndef
.Gardez à l'esprit que la version ci-dessus n'est pas aussi sûr que d'une fonction en ligne, par exemple
max(a++,b--)
va provoquer unxpected résultats.#undef max
à la place. Voir mes autres commentaires sur pourquoi...Votre macro donne le minimum de deux nombres. Devrait être
(a) > (b)
surpris personne ne l'a remarqué pour les 5 dernières années. fixe!
OriginalL'auteur John Ledbetter
Donc répondre à votre question principale:
Non, il n'est pas défini dans windef.h autour de la ligne 187:
OriginalL'auteur Calmarius
vous pouvez utiliser l'état de la compilation:
#undef max
serait beaucoup mieux. Si MSVC est tellement brisé que de définir unmax
macro dans la norme en-têtes, vous pouvez vraiment leur faire confiance pour définir correctement? 🙂OriginalL'auteur Vladimir Ivanov
Dans Visual C++, si vous
#define NOMINMAX
avant, y compris les en-têtes standard, vous n'obtiendrez pas une macromax
oumin
._NOMINMAX
au lieu de cela, il serait conforme, maisNOMINMAX
est réservée à l'application, et c'est nonconformant pour la bibliothèque standard les en-têtes de l'utiliser pour leur propre but.OriginalL'auteur Bill Lynch