在C++#include<filename> and #include<filename.h
中使用> 有什么区别?使用这两者中的哪一个以及为什么使用它?
5 回答
C++ 仅包含在 C 标准中找不到的文件,从未使用过filename.h
。自从第一个 C++ 标准问世(1998 年)以来,他们一直使用filename
自己的头文件。
C 标准继承的文件变成cfilename
了filename.h
. 继承使用 like 的 C 文件filename.h
已弃用,但仍是 C++ 标准的一部分。
不同之处在于,在 C 中未定义为宏的名称在 C++ 中的命名空间内找到std::
,cfilename
而 infilename.h
中的名称在全局命名空间范围内。所以你会::size_t
在 stddef.h 和std::size_t
cstddef 中找到。两者都是标准 C++,但不推荐使用 ::size_t(参见 C++ 标准的附录 D)。
现在这些是不同的。
为什么要使用 `filename.h` ?
- 与 C 编译器的兼容性
- 与非常古老的 C++ 编译器的兼容性
为什么要使用 `cfilename` ?
- 名称在命名空间内
std::
。不再有名称冲突。 - 新的 C++ 特性(例如,浮点数、长整数的重载数学函数)
- C 兼容性标头 (
filename.h
) 将来可能会消失。
在 C++ 标准之前的#include <foo.h>
C++ 代码中很常见。该标准将其更改为#include <foo>
从标题中放置在std
名称空间中的所有内容。(感谢 litb 指出该标准从未允许 .h 标头。)
没有什么魔法,第一个查找名为“foo.h”的文件,第二个查找名为“foo”的文件。它们是文件系统中的两个不同文件。该标准只是更改了应包含的文件的名称。
在大多数编译器中,旧的头文件仍然存在以实现向后兼容性(以及与 C 的兼容性),但是想要遵循标准的现代 C++ 程序不应该使用它们。
在标准 C 头文件的情况下,C++ 版本以 ac 开头,因此 C 头文件
#include <stdio.h>
变成
#include <cstdio>
旧标准使用#include <filename.h>
语法。当命名空间和模板添加到语言中时,标准更改为#include <filename>
.
这样做是为了让标准库的东西都可以放在 std 命名空间中。没有命名空间概念的旧代码仍然可以工作,因为#include <filename.h>
文件不使用命名空间。
新代码应始终使用该#include <filename>
格式。如果您使用旧格式,则它们定义的所有符号都将放置在全局命名空间中,而不是 std。
没有 .h 的是 C++ 头文件,而那些有 .h 的是 C 头文件。这仅适用于 C++ 中的标准头文件。
如果您包含自己的文件或不属于标准 C++ 的文件,则需要始终编写完整的文件名(可以是任何文件名)。
如果您在谈论标准库(因为否则它根本不起作用),区别在于
#include< header >
//my code
是根据 C++ 标准调用标头的正确方法,而
#include< header.h >
//my code
已弃用(在 C++ 标准中,但根据 C99 标准仍然是必需的)并与 C 包的其余部分一起出现。
所以你应该使用:
#include< cmath >
//my code
不是:
#include< math.h >
//my code