在C++中包含头文件时,用<>
括起来时是否包含 .h 的区别是什么?
用
<>
符号括起来时包含 .h 后缀和不包含有何区别?#include <iostream> 和 #include <iostream.h>之间的区别是什么?
用双引号包含头文件名与用
<>
符号包含头文件名的区别是什么?#include <iostream.h> 和 #include "iostream.h" 之间的区别是什么?
简而言之:
iostream.h
已经被弃用,这是Stroustrup版本。 iostream
是标准委员会的版本。一般地,编译器将它们都指向相同的东西,但一些旧的编译器可能没有旧版本。在一些奇怪的情况下,它们将同时存在并且不同(以支持遗留代码),那么你必须明确指定。
""
与<>
只是表示在大多数编译器中,在前往库之前检查本地目录中的头文件。
#include<iostream.h>
在我们的程序中包含了一个名为 iostream.h 的特定文件,而 #include<iostream>
仅仅保证了 iostream 库中的所有内容都被包含在我们的程序中。我的理解正确吗? - Shravan这里有一篇不错的文章。
简而言之,原因是:
C++标准委员会生产的iostream库版本与CFront实现相差很大。{snip}
为了方便过渡,C++标准委员会宣布,包括标准C++头文件的代码将使用没有扩展名的include指令。这使得编译器供应商可以将旧风格的C++库头文件与.h扩展和新风格的头文件一起发布。
不使用.h版本的优点:
有几个原因说明为什么新代码应该使用无扩展名版本的头文件而不是.h形式。首先是当在现代编译器上编译此类代码时的不可预测性。如前所述,使用.h头文件的结果是特定于实现的。随着时间的推移,给定编译器具有旧样式库的机会减少。
通常情况下,<> 用于系统或标准库文件,而 "" 用于项目文件。如果编译器在本地找不到文件,则默认使用标准库版本。
至于 .h 文件,在 C 中并不重要。在 C++ 中,我模糊地记得有一个新版本和一个旧版本,没有 .h 应该是新版本,但我甚至不确定旧版本是否仍然存在。
对于第一个问题的简单答案是,iostream.h不存在,至少在GCC实现中是这样。如果您使用的是类Unix系统,请键入
% locate iostream.h
/usr/include/c++/3.4.3/backward/iostream.h
和
% locate iostream
/usr/include/c++/3.4.3/iostream
/usr/include/c++/3.4.3/backward/iostream.h
正如Zee's article所说,iostream.h用于向后兼容。
这实际上是两个不同的问题。
.h和没有扩展名但同名的头文件之间的区别是历史性的。带有.h扩展名的文件来自最初的C++标准,该标准没有一些现代功能,例如命名空间和模板。对于新标准来说,将相同的功能放入新的头文件中以便使用这些新功能并保留旧的(.h)文件以向后兼容遗留代码更为简单。
#include <...>和#include "..."格式之间的区别在于编译器查找文件的顺序。这通常取决于实现,但其思想是<>格式首先查找系统包含目录,而""则在第一个包含它的源文件所在的相同目录中查找。