【问题标题】:C++ includes with and without .h [duplicate]C ++包括有和没有.h [重复]
【发布时间】:2010-05-10 00:10:57
【问题描述】:

可能重复:
What is the difference between using #include<filename> and #include<filename.h> in c++

我从来没有注意到我是否在包含的末尾包含 .h 有什么不同,所以我总是忽略了它的含义,但我只是在我的一个特定程序中注意到,我如果包含“string”,则会出现错误“memcpy 未在此范围内声明”,但如果包含“string.h”则不会。

首先,我想知道造成这种情况的具体原因,也大致上是两者的区别。同时,如果有人能解释尖括号中的包含和引号中的包含之间的区别,不胜感激。

【问题讨论】:

标签: c++


【解决方案1】:

&lt;string&gt; 是包含std::string 及其朋友的C++ 标准库字符串头文件。 &lt;string.h&gt; 是与 C 标准库不同的头文件,它具有用于操作 C 字符串(以空结尾的字符串)和其他相关函数的函数。

两者是完全不同且无关的。在 C++ 中(就像在 C 中一样),头文件可以有任何扩展名。 C++ 标准库头文件没有扩展名; C 标准库头文件有一个.h 扩展名。 .hpp.hxx 也很常见。

【讨论】:

  • 还要注意(我相信)即使包含指令是&lt;string&gt; 或其他什么,编译器也不需要实际调用相应的文件string
  • @Mark B:确实;它甚至根本不必是一个文件。我不知道任何不使用带有标题名称的文件的实现;我想我会觉得这很令人困惑!
  • 詹姆斯所说的一切都是真的。有趣的是,在更新的标准 C++ 中,C 字符串文件已重命名为 - 事实上,所有 C 标准库,当升级为 C++ 标准库时,都已重命名为 'c' 前缀并且没有 ' .h' 扩展名,即 cstdlib、cstdio 等。应该将 C 函数也移动到 std 命名空间中。许多编译器继续支持 等,并且不将 C 标准库放在 std:: 中,但我相信他们不再需要这样做了。
  • @jwismar:所有实现都需要提供&lt;cname&gt;&lt;name.h&gt; 标头;正如您所说,&lt;cname&gt; 标头将其所有非宏名称放入命名空间 std,而 &lt;name.h&gt; 标头将其所有非宏名称放入全局命名空间。在许多实现中,&lt;cname&gt; 标头也将它们的名称放入全局命名空间;这在技术上在 C++03 中是不允许的,但在即将到来的 C++0x 中将被允许。
【解决方案2】:

我要补充一点,在 C++ 中,有一些 C 标头以传统 C 形式提供,例如 string.h,而这些标头的使用类似于 #include &lt;string.h&gt;,但也有名称以字母“c”开头的对应标头" 并且没有扩展名 - 例如cstring。这些标头与 C++ 标头 #include &lt;cstring&gt; 一样使用,并且这些标头的名称位于 std 命名空间中。

【讨论】:

    【解决方案3】:

    它们是两个不同的文件,彼此无关。

    #include &lt;string&gt; 指的是 C++ 标准库 STL 字符串

    #include &lt;string.h&gt; 定义了几个函数来操作 C 字符串和数组。

    假定包含没有扩展名。

    某些头文件没有附加 .h。您通常会在包含模板的头文件中看到这一点。

    【讨论】:

      【解决方案4】:

      关于尖括号中的include和引号中的include之间的区别,first指示预处理器首先沿着/I编译器选项指定的路径搜索包含文件。第二个告诉预处理器在包含#include 语句的文件的同一目录中查找包含文件。

      【讨论】:

        【解决方案5】:

        关于使用尖括号和引号之间的区别,我认为它与查找头文件的顺序有关:如果它在引号之间,编译器将首先检查工作目录(不是很在检查系统头文件目录之前,对系统头文件很有用,因为它们与编译器不在同一目录中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-11
          • 1970-01-01
          相关资源
          最近更新 更多