最有可能的是,其中的某些内容iostream
直接或间接包含了其他一些定义std::min
和的标头std::max
。(也许algorithm
它本身已经包含在内。也许是一些用于实现 C++ 标准库的内部头文件。)
你不应该依赖这种行为。algorithm
如果您想要 std::min 和 std::max,请包括。
如果您习惯于一种具有模块系统的语言,其中模块可以导入其他模块并且不会被迫从它们的导入中导出任何内容(例如,Racket 的模块系统),那么这种行为可能会令人困惑。
然而,回想一下,#include 正在执行文本替换。处理 #include 行时,它会从 .cpp 文件中删除,并替换为它所指向的文件的内容。
大多数编译器都有一个选项来转储运行预处理器的输出,这样您就可以追踪什么包括什么。您在对 kmort 的回答的评论中说您正在使用 Visual Studio Express。使用 Visual C++ 编译器将文件预处理为文件的命令行是cl /P foo.cpp
. 使用此输出,我们可以发现 的定义std::max
来自特定于实现的 header 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