0

可能重复:
<string> 和 <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,包含文件位于子目录 C:\Program Files\RAD Studio\9.0\include 中。

4

3 回答 3

8
#include <string>

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

#include <string.h>

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

#include <cstring>

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

编辑:经验法则 - C++ 标头永远不会以“.h”结尾。使用“c”作为传统 C 标头名称的前缀并删除“.h”以保持全局命名空间干净。仅对项目的 C 头文件使用“.h”。对仅 C++ 的标头使用“.hpp”。

于 2012-07-10T11:44:09.427 回答
2

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

C 标准库中的每个标头都以不同的名称包含在 C++ 标准库中,通过删除 .h 并在开头添加“c”生成;例如,“time.h”变成“ctime”。这些头文件和传统的 C 标准库头文件之间的唯一区别是函数应该尽可能放在 std:: 命名空间中(尽管很少有编译器实际上这样做)。在 ISO C 中,标准库中的函数允许用宏来实现,而 ISO C++ 不允许。

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

于 2012-07-10T11:44:53.800 回答
-2

按照惯例,C(过程)标头以 '.h' "string.h", "stdio.h"... 结尾,而 C++(主要面向对象)不包含任何扩展名: "iostream", "string" 。 ..

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

于 2012-07-10T11:46:07.333 回答