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

时间:2008-11-19 11:07:06

标签: c++ include namespaces

使用#include<filename> and #include<filename.h&gt;之间的区别在C++?使用了哪两个,为什么要使用它?

5 个答案:

答案 0 :(得分:32)

C ++仅包含C语言中未找到的文件,从未使用filename.h。自从第一个C ++标准出版(1998)以来,他们已经使用filename作为自己的标题。

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

不同之处在于,在C ++中的std::中的名称空间cfilename中找不到C中未定义为宏的名称,而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)将来可能会消失。

答案 1 :(得分:18)

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

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

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

对于标准C头文件,C ++版本在开头有一个c,所以C头文件

#include <stdio.h>

变为

#include <cstdio>

答案 2 :(得分:4)

旧标准使用#include <filename.h>语法。将名称空间和模板添加到语言后,标准已更改为#include <filename>

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

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

答案 3 :(得分:2)

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

#include< header >
//my code

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

#include< header.h >
//my code

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

所以你应该使用:

#include< cmath >
//my code

#include< math.h >
//my code

答案 4 :(得分:0)

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

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