Pourquoi std :: max et std :: min peuvent-ils encore être utilisés même si je n'ai pas #include & lt; algorithme & gt ;?
#include <iostream>
int main()
{
int value1 = 1, value2 = 10;
std::cout << "Min = " << std::min(value1,value2) <<std::endl;
std::cout << "Max = " << std::max(value1,value2)<< std::endl;
}
Autant que je sache, le min
et max
fonctions sont définies dans <algorithm>
.
Si je n'ai pas dit le pré-processeur pour inclure <algorithm>
pourquoi le code fonctionne encore?
source d'informationauteur Anthony
Vous devez vous connecter pour publier un commentaire.
Très probablement, quelque chose à l'intérieur de
iostream
a, directement ou indirectement, à d'autres d'en-tête qui définitstd::min
etstd::max
. (Peut-êtrealgorithm
lui-même a été inclus. Peut-être certains d'en-tête qui est utilisé pour mettre en œuvre votre C++ standard library.)Vous ne devriez pas compter sur ce comportement. Inclure
algorithm
si vous voulez std::min et std::max.Si vous êtes habitué à une langue avec un système de module dans lequel les modules peuvent importer d'autres modules et ne pas être forcé à l'exportation rien de la part de leurs importations (p. ex., Raquette module du système), ce comportement peut être source de confusion.
Rappeler, toutefois, que #include est fait textuelle de substitution. Quand le #include ligne est traitée, il est retiré de la .fichier cpp et remplacé par le contenu du fichier qu'il a été pointant vers.
La plupart des compilateurs ont une option de vidage de la sortie de l'exécution de la préprocesseur de sorte que vous pouvez suivre ce qui est compris quoi. Vous avez dit dans votre commentaire kmort de la réponse que vous êtes à l'aide de Visual Studio Express. La ligne de commande pour prétraiter un fichier à un fichier en utilisant le compilateur Visual C++ est
cl /P foo.cpp
. À l'aide de cette sortie, nous pouvons constater que la définition destd::max
est de la mise en œuvre spécifique de l'en-têtexutility
. (Placer le curseur à l'intérieur du texte "std:max" et en appuyant sur la touche F12 dans Visual Studio est encore plus rapide. :-] )kmort également mentionné le
/showIncludes
commutateur de compilateur. En utilisant cela, on peut suivre aisément le comprendre à la chaîne. Voici la réduction de la production de ma course.Quel compilateur que vous utilisez?
J'ai vu des compilateurs avant qui sont un peu "pardon" pour les éléments communs qui sont définis dans la libc ou libstdc++. Il va tirer dans les références pour vous. En d'autres termes, vous n'avez pas à dire ça à un lien avec elle, ni inclure l'en-tête. Il fonctionne, tout simplement. Alors que je n'aurais pas attendu cette de
min()
etmax()
il n'est pas trop surprenant.Cela peut aussi arriver par un autre en-tête, y compris celui que vous devez être, y compris, mais ce ne doit pas être invoqué. Et je ne vous attendez pas à avoir lieu dans ce cas.