39

在C++#include<filename> and #include<filename.h中使用> 有什么区别?使用这两者中的哪一个以及为什么使用它?

4

5 回答 5

38

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

C 标准继承的文件变成cfilenamefilename.h. 继承使用 like 的 C 文件filename.h已弃用,但仍是 C++ 标准的一部分。

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

现在这些是不同的。

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

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

为什么要使用 `cfilename` ?

  • 名称在命名空间内std::。不再有名称冲突。
  • 新的 C++ 特性(例如,浮点数、长整数的重载数学函数)
  • C 兼容性标头 ( filename.h) 将来可能会消失。
于 2008-11-19T13:33:10.773 回答
22

在 C++ 标准之前的#include <foo.h>C++ 代码中很常见。该标准将其更改为#include <foo>从标题中放置在std名称空间中的所有内容。(感谢 litb 指出该标准从未允许 .h 标头。)

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

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

在标准 C 头文件的情况下,C++ 版本以 ac 开头,因此 C 头文件

#include <stdio.h>

变成

#include <cstdio>
于 2008-11-19T11:13:54.047 回答
6

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

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

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

于 2008-11-19T13:13:24.663 回答
2

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

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

于 2008-11-19T11:09:24.947 回答
2

如果您在谈论标准库(因为否则它根本不起作用),区别在于

#include< header >
//my code

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

#include< header.h >
//my code

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

所以你应该使用:

#include< cmath >
//my code

不是:

#include< math.h >
//my code
于 2008-11-19T11:09:56.473 回答