#include <file> #include < file.h> - 有什么区别?

#include <file> #include <file.h> - what's the difference?

本文关键字:file #include gt lt 区别 什么      更新时间:2023-10-16

可能重复:
<字符串>并且<string.h>?

我的具体示例使用以下子句:

#include <string>

如果我使用以下条款代替

#include <string.h>

编译器以错误结束

[BCC32错误]utils.cpp(173):E2316"getline"不是"std"的成员

utils.cpp文件中的第173行如下:

while(std::getline(in, line, 'n'))

我认为这两个条款没有区别。现在我很困惑。这两个条款实际上包括哪些文件?比方说,我的C++Builder安装有程序目录C:\program Files\RAD Studio\9.0,include文件位于子目录C:\program Files\RAD Studo\9.0\include.

#include <string>

这包括C++字符串标头。

#include <string.h>

这包括C字符串头,所有标识符都在全局命名空间中。(已弃用。)

#include <cstring>

这包括C字符串头,所有标识符都放在std::命名空间中。

编辑:经验法则-C++标头永远不会以".h"结尾。在传统的C标头名称前加上"C",然后去掉".h"以保持全局命名空间的干净。仅对项目的C头使用".h"。对于仅限C++的标头,请使用".hpp"。

它们是两个不同的标头。C标准库中的约定是标头以.h结尾,而在C++标准库中,约定是完全忽略文件扩展名。来自维基百科的更多细节:

C标准库中的每个标头都包含在C++不同名称下的标准库,通过删除.h,并在开头添加一个"c";例如,"time.h"变为"ctime"。这些头文件与传统的C标准库标题是,在可能的情况下,函数应该放在std::命名空间中(尽管实际上很少有编译器这样做这个)。在ISO C中,标准库中的函数允许由宏实现,这是ISO C++不允许的。

其他库遵循不同的约定。例如,Boost选择.hpp作为其选择的C++报头扩展。

按照惯例,C(Procedureal)标头以'.h'"string.h"、"stdio.h"结尾…和C++(主要面向对象)不包括任何扩展:"iostream"、"string"。。。

不确定是否所有标头都遵循此约定,但我认为标准标头都遵循。