#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;
}
据我所知,min
和max
函数在中定义<algorithm>
。
如果我没有告诉预处理器包括<algorithm>
为什么代码仍然起作用?
最有可能的是,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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句