【发布时间】:2014-05-04 05:18:07
【问题描述】:
我有一个简单的程序,我在其中按升序或降序排列int 数组的元素,并使用swap() 函数来移动元素。我编译了这个程序,没有任何错误,它运行起来就像一个魅力。事后我才注意到,在我编译之前,我忘记了#include 定义了swap() 的库(<algorithm>,或<utility> C++11)。
为什么它仍然有效?我的程序的顶部看起来像这样:
#include <iostream>
#include <cstdlib>
using namespace std;
我尝试取出<iostream>,只是想看看会发生什么,它可以预见地发出一堆'cout/cin/endl' was not declared in this scope 错误,但我惊讶地发现它也给出了一些'swap' was not declared in this scope 错误。这是否意味着swap() 在<iostream> 中定义?我不认为它应该是,不是吗?
无论如何,对于一个简单的答案来说,这可能是一个很长的问题,但我很好奇。我还在学习C 和C++,所以我不知道很多东西,而且我无法通过“全能”谷歌机器找到这个特殊谜团的答案,所以我来了。
提前致谢!
【问题讨论】:
-
iostream 可以包含它需要的任何标头。但是,您不能依赖这种间接包含,否则您的代码可能无法在其他环境中编译。
-
所以我的
<iostream>版本可能与标准版本不同?我没有在自己的系统上工作,所以我不知道库可能会或可能不会进行哪些更改。 -
@TheQZ:他并不是说你的
<iostream>有什么问题。该标准允许它包含其他标题,但它不是必须的。如果您不直接包含您使用的所有标头,您的代码可能会在其他编译器上中断,它们提供了同样有效的<iostream>版本,不包含任何其他内容。 -
我的理解是C++标准并没有规定STL lib头文件应该如何相互依赖,所以根本没有标准版本。
-
好的,有道理。我正在使用的编译器的
<iostream>有自己的#includes,在其他编译器中可能存在也可能不存在,所以无论如何#include其他库更安全。