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

时间:2012-07-10 11:41:42

标签: c++ include c++builder-xe2

  

可能重复:
  Difference between <string> and <string.h>?

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

#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。

3 个答案:

答案 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”,“字符串“...

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