在C++中使用#include <filename>和#include <filename.h>之间的区别

yes*_*aaj 27 c++ namespaces include

#include<filename> and #include<filename.hC++中使用>有什么区别?使用了哪两个,为什么要使用它?

Joh*_*itb 33

C++只包含从未使用的C标准中找不到的文件filename.h.自从第一个C++标准出版(1998年)以来,他们已经使用filename了自己的标题.

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

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

现在这些是不同的.

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

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

你为什么要用`cfilename`?

  • 名称在命名空间内std::.没有名字冲突了.
  • 新的C++特性(例如浮点数的重载数学函数,长)
  • C兼容性标题(filename.h)将来可能会消失.

  • 弃用被定义为“标准当前版本的规范,但不保证在未来的修订版中成为标准的一部分。” (2认同)

CAd*_*ker 19

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

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

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

在标准C头的情况下,C++版本在开头有ac,所以C头

#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

#include <cstdio>
Run Code Online (Sandbox Code Playgroud)


Fer*_*cio 5

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

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

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