我的具体示例使用以下子句:
#include <string>
如果我使用以下条款
#include <string.h>
编译器以错误
结束[BCC32错误] utils.cpp(173):E2316&#39; getline&#39;不是&#39; std&#39;
的成员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。
答案 0 :(得分:8)
#include <string>
这包括C ++字符串标题。
#include <string.h>
这包括C字符串标头,以及全局命名空间中的所有标识符。 (已过时。)
#include <cstring>
这包括C字符串标头,所有标识符都放在std::
名称空间中。
编辑:经验法则 - C ++标题永远不会以“.h”结尾。使用“c”作为传统C标头名称的前缀,并删除“.h”以保持全局名称空间的清洁。仅对项目的C标头使用“.h”。使用“.hpp”表示C ++ - 仅限标题。
答案 1 :(得分:2)
它们是两个不同的标题。 C
标准库中的约定是标题以.h
结尾,而在C++
标准库中,约定是完全错过文件扩展名。来自维基百科的更多细节:
C标准库中的每个标头都包含在C ++中 标识库名称不同,通过删除.h生成, 并在开头添加'c';例如,'time.h'变为'ctime'。 这些标头与传统C之间的唯一区别 标准库标题是函数应尽可能的标题 被放入std :: namespace(虽然很少有编译器可以做到 这个)。在ISO C中,允许使用标准库中的函数 由宏实现,这是ISO C ++不允许的。
其他图书馆遵循不同的惯例。例如,Boost会选择.hpp
作为其C++
标题扩展名。
答案 2 :(得分:-2)
按照惯例,C(Procedural)标题以“.h”“string.h”,“stdio.h”结尾...而C ++(主要面向对象)不包含任何扩展名:“iostream”,“字符串“...
不确定所有标题是否遵循此约定,但我认为标准都符合此标准。