在 C++ 中包含头文件时,有什么区别...

1) 当将其包裹在 < > 符号中时包含 .h 与不包含 .h ?

#include <iostream> vs. #include <iostream.h>

2) 将标头名称用双引号括起来还是用 < > 符号括起来?

#include <iostream.h> vs. #include "iostream.h"

提前致谢!

有帮助吗?

解决方案

简而言之:

iostream.h已被弃用 - 它是最初的Stroustrup版本,iostream是标准委员会的版本。通常编译器将它们指向同一个东西,但是一些较旧的编译器不会使用较旧的编译器。在一些奇怪的情况下,它们将存在并且不同(以支持遗留代码),然后您必须具体。

&QUOT;&QUOT;与&lt;&gt;只是意味着在进入库之前检查本地目录中的标题(在大多数编译器中)。

- 亚当

其他提示

这是一个不错的链接文章。

总结一下,原因如下:

  

标准委员会的iostream库版本   制作与CFront实施有很大不同。   {剪断}

     

为了简化过渡,C ++标准委员会宣布了该代码   包括标准C ++头文件将使用include指令   没有延期。这允许编译器供应商发布旧样式   带有.h扩展名和新样式头的C ++库头   不

不使用.h版本的优点:

  

使用the编写新代码有几个原因   头文件的无扩展版本而不是.h表单。该   首先是在现代编译时这种代码的不可预测性   编译器。如前所述,使用.h标头的结果   是具体的实施。随着时间的推移,一个机会   给定编译器将使旧样式库可用减少。

作为标准委员会(X3J16)中提议离开.h的人,我的初衷是解决关于.h,.H,.hpp,.hxx或.h ++文件扩展名的争论;或者某些人希望标准中没有暗示这是磁盘上文件的名称,以便允许IDE将预编译的头信息从某个内部(例如资源文件)或者甚至是编译器。

虽然Unix认为文件名是单个字符串并且实际上没有识别扩展的概念,但DEC操作系统具有将名称与扩展名分开并且提供“默认扩展名”的传统。如果在特定情况下被省略。这就是我从实现中使用实现想要使用的任何扩展的想法,并且它允许实现甚至不在磁盘上有这个文件。 (那时我是委员会的DEC代表。)

区分标准标头和预标准标头是一个额外的好处。

标准方式(并且唯一保证可行的方式)是&lt; iostream&gt;。在gcc上,&lt; iostream.h&gt; (可能需要包含在&lt; backward / iostream.h&gt;中)将相关声明提取到全局命名空间(因此您不需要std :: namespace前缀)。

&QUOT; iostream.h&QUOT;将首先从包含源代码的目录中尝试,因为“&quot;”适用于项目的标题。 &LT;&GT;应始终用于系统标头,并且“&quot;为你自己的标题。

通常&lt;&gt;用于系统或标准库文件,而“”用于系统或标准库文件。用于项目文件。如果您的编译器在本地搜索并且在找不到它时,我不会感到惊讶它默认为标准库版本。

至于.h,如果你使用C,我认为这并不重要。 在C ++中,我隐约记得有一个较新的版本和一个较旧的版本,没有它应该是新版本,但我甚至不确定旧版本是否仍然存在。

这确实是两个不同的问题。

  • 以相同名称的.H和无伸展标头之间的区别在于历史。带有.H扩展名的人来自原始的C ++标准,该标准没有某些现代功能,例如名称空间和模板。对于新标准来说,将相同的功能放在新标头文件中更简单,以便能够使用这些新功能并保留旧的(.H)文件以使旧版代码向后兼容。

  • #include <...>和#include“ ...”格式之间的差异是编译器查找文件的顺序。这通常取决于实现,但是想法是,<>格式在系统中的外观首先包含目录,而“”与#首先包含它的源文件相同的目录。

第一个答案的简单答案是iostream.h不存在,至少在GCC实现中是这样。如果你在* nix上,请输入

%找到iostream.h 结果,在/ usr /包括/ C ++ / 3.4.3 /后退/ iostream.h

%找到iostream 结果/usr/include/c++/3.4.3/iostream 结果,在/ usr /包括/ C ++ / 3.4.3 /后退/ iostream.h

正如Zee的文章所说,iostream.h是为了向后兼容。

关于标准C ++头文件的名称,在X3J16的早期(前2年),我们遇到了关于扩展应该在标准C ++头文件上的争论。当时由不同的供应商使用(并且受到某些操作系统对文件名的限制的影响)我相信有.h,.H,.h ++,。hpp,.HXX,以及可能的其他。在库组会议中,我建议我们关闭扩展,如果include行中没有,则将其留给实现提供其选择的默认文件扩展名,或者将名称用作数据库中的键。如果需要,预编译的头文件。 [虽然类Unix系统将文件名和'扩展名'视为单个字符串,但我在委员会中代表DEC,并且许多DEC操作系统将扩展名存储在目录中,作为名称中的单独字段。所以DEC操作系统有一个强大的传统,即根据程序访问文件的目的应用默认扩展。告诉汇编程序'X,Y = Z'可能会导致读取输入文件Z.MAC(宏)并写入输出文件X.OBJ和Y.LST。无论如何,它避免了长时间的,没有赢的辩论,因此该组与此同时,Andy Koenig向整个接受它的委员会介绍了该小组对此(以及其他)的结论。我觉得有点有趣的是,实现错过了他们可以应用他们选择的默认扩展(我认为对编辑器和其他工具有用)并且只是将扩展名从文件名中删除的重点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top