【问题标题】:Difference between using #include<filename> and #include<filename.h> in C++在 C++ 中使用 #include<filename> 和 #include<filename.h> 之间的区别
【发布时间】:2010-09-23 00:41:36
【问题描述】:

C++ 中使用#include&lt;filename&gt; and #include&lt;filename.h> 有什么区别?两者都用哪一个,为什么用?

【问题讨论】:

  • 投票重新开放。这个问题是关于&lt;foo&gt;&lt;foo.h&gt;,而the linked question 是关于&lt;foo(.h)&gt;"foo(.h)"。链接的问题肯定是相关的并且是有用的资源,但它不是重复的。

标签: c++ include namespaces


【解决方案1】:

没有 .h 的是 C++ 头文件,而那些带有 .h 的是 C 头文件。这仅适用于 C++ 中的标准头文件。

如果您包含自己的文件或不属于标准 C++ 的文件,您需要始终编写完整的文件名(可以是任何名称)。

【讨论】:

    【解决方案2】:

    如果你在谈论标准库(因为否则它根本不会工作),区别是

    #include< header >
    //my code
    

    是根据 C++ 标准调用标头的正确方法,而

    #include< header.h >
    //my code
    

    已被弃用(在 C++ 标准中,但根据 C99 标准仍然是必需的)并与其他 C 包一起出现。

    所以你应该使用:

    #include< cmath >
    //my code
    

    不是:

    #include< math.h >
    //my code
    

    【讨论】:

    • 它没有被弃用,如果你想进行 C 编程,你必须使用 .h 文件。
    【解决方案3】:

    #include &lt;foo.h&gt; 在 C++ 标准之前的 C++ 代码中很常见。该标准将其更改为#include &lt;foo&gt;,并将标头中的所有内容放在std 命名空间中。 (感谢 litb 指出该标准从未允许 .h 标头。)

    没有魔法,第一个查找名为“foo.h”的文件,第二个查找名为“foo”的文件。它们是文件系统中的两个不同文件。标准只是更改了应该包含的文件的名称。

    在大多数编译器中,旧的头文件仍然存在以实现向后兼容性(以及与 C 的兼容性),但想要遵循标准的现代 C++ 程序不应使用它们。

    对于标准 C 头文件,C++ 版本以 c 开头,因此 C 头文件

    #include <stdio.h>
    

    变成

    #include <cstdio>
    

    【讨论】:

    • 怎么样?您是如何在答案中简单地写包含在内的?我对你的真棒感到完全困惑:)
    • 用反引号编写的代码块似乎对 lt 和 gt 做了正确的事情。 =)
    • 仅适用于标准头吗?
    • 是的。我将对此添加一行。
    • 另外,你也犯了同样的错误。 filename.h(如 iostream.h)从来都不是任何 c+ 标准的一部分。
    【解决方案4】:

    旧标准使用#include &lt;filename.h&gt; 语法。当命名空间和模板添加到语言中时,标准更改为#include &lt;filename&gt;

    这样做是为了让标准库的东西都可以放在 std 命名空间中。由于#include &lt;filename.h&gt; 文件不使用命名空间,因此没有命名空间概念的旧代码仍然可以工作。

    新代码应始终使用#include &lt;filename&gt; 格式。如果您使用旧格式,它们定义的所有符号都将放置在全局命名空间中,而不是 std。

    【讨论】:

    • 没有使用 filename.h 的“旧标准”。在第一个 c++ 标准出现之前,这在编译器中很常见
    • :-) 这就是我喜欢的 abt stackoverflow
    • 好的,标准可能有点强。我应该说“事实上的标准”或“惯例”。
    【解决方案5】:

    在 C 标准中找不到的仅 C++ 包含文件从未使用过 filename.h 。自从第一个 C++ 标准问世(1998 年)以来,他们一直使用filename 作为自己的标头。

    由 C 标准继承的文件变为 cfilename 而不是 filename.h。像 filename.h 这样继承使用的 C 文件已被弃用,但仍然是 C++ 标准的一部分。

    不同之处在于,未在 C 中定义为宏的名称在 C++ 中的 cfilename 中的命名空间 std:: 中找到,而在 filename.h 中的名称在全局命名空间范围内。所以你会在 stddef.h 中找到 ::size_t,在 cstddef 中找到 std::size_t。两者都是标准 C++,但不推荐使用 ::size_t(参见 C++ 标准的附录 D)。

    这就是区别。

    为什么要使用`filename.h`?

    • 与 C 编译器的兼容性
    • 与非常旧的 C++ 编译器的兼容性

    为什么要使用`cfilename`?

    • 名称位于命名空间 std:: 中。不再有名称冲突。
    • 新的 C++ 功能(例如,浮点数、长整数的重载数学函数)
    • C 兼容性标头 (filename.h) 将来可能会消失。

    【讨论】:

    • 谢谢你能解释一下 - 不同之处在于 C 中未定义为宏的名称是在 C++ 中的 cfilename 中的命名空间 std:: 中找到的
    • 好吧。预处理器不知道 C++ 命名空间。它不关心任何范围。所以 C++ 不能将宏放入命名空间。标准明确指出,即使 C 允许实现为函数,C++ 实现仍应使它们成为宏。这是结果,也是一件好事。
    • 即使它们已被弃用,任何理智的编译器供应商都不会弃用 C++ 中 filename.h 的使用。他们会破坏太多的程序并激怒太多的客户/开发人员。
    • 弃用并不意味着它不起作用。如果没有警告,您也不会注意到。毕竟,编译器不需要为它们提供任何东西。
    • 弃用被定义为“标准的当前版本的规范,但不保证在未来的修订中成为标准的一部分。”
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多