为什么即使我没有#include <algorithm>,仍然可以使用std :: max和std :: min?

Ant*_*ony 16 c++ include-guards preprocessor-directive

#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;              
} 
Run Code Online (Sandbox Code Playgroud)

据我所知,minmax函数的定义<algorithm>.

如果我没有告诉预处理器包含<algorithm>为什么代码仍然有效?

chw*_*arr 21

最有可能的是,内部的东西iostream直接或间接地包含了一些定义std::min和的标题std::max.(也许algorithm它本身已被包含在内.也许是一些用于实现C++标准库的内部头文件.)

你不应该依赖这种行为.包括algorithm如果你想要的std ::分和std ::最大.

如果您习惯使用具有模块系统的语言,其中模块可以导入其他模块而不必强制从其导入中导出任何内容(例如,Racket的模块系统),则此行为可能会令人困惑.

但是,回想一下,#include正在进行文本替换.处理#include行时,它将从.cpp文件中删除,并替换为它指向的文件的内容.

大多数编译器都可以选择转储运行预处理器的输出,以便跟踪包含内容的内容.您在评论中对kmort的回答说您使用的是Visual Studio Express.使用Visual C++编译器将文件预处理到文件的命令行是cl /P foo.cpp.使用此输出,我们可以发现定义std::max来自特定于实现的标头xutility.(将插入符号放在文本"std:max"中并在Visual Studio中按F12会更快.: - ])

kmort还提到了/showIncludes编译器开关.使用它,我们可以轻松追踪包含链.这是我跑步减少的输出.

Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\iostream
Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\istream
Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\ostream
Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\ios
Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocnum
Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\streambuf
Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xiosbase
Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocale
Note: including file:         C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\stdexcept
Note: including file:          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xstring
Note: including file:           C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xmemory0
Note: including file:            C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xutility
Run Code Online (Sandbox Code Playgroud)