可能重复:
What is the difference between using #include<filename> and #include<filename.h> in c++
我从来没有注意到,无论我是否在包含的末尾都包含.h,所以我总是忽略其含义,但我只是在我的特定程序中注意到,我如果我包含“string”,则会收到错误“memcpy未在此范围内声明”,但如果我包含“string.h”则不会。
首先,我想知道这个具体原因,但一般也是两者的区别。同时,如果有人能够解释尖括号中的包含与引号中的包含之间的区别,那么我们将非常感激。
答案 0 :(得分:28)
<string>
是包含std::string
及其朋友的C ++标准库字符串头文件。 <string.h>
是与C标准库不同的标题,它具有操作C字符串(以空字符结尾的字符串)和其他相关函数的函数。
两者完全不同且无关。在C ++中(如在C中),头文件可以具有任何扩展名。 C ++标准库头没有扩展名; C标准库头文件的扩展名为.h
。 .hpp
或.hxx
也很常见。
答案 1 :(得分:6)
我只想补充一点,在C ++中,有一些传统的C形式可用的C标题,如string.h
,它们的使用方式与#include <string.h>
类似,但也有一些名称以cstring
开头的对应标题。字母“c”,没有扩展名 - 如#include <cstring>
。这些标头用作C ++标头std
,这些标头中的名称位于{{1}}名称空间中。
答案 2 :(得分:2)
它们是两个不同的文件,彼此无关。
#include <string>
指的是C ++标准库STL字符串
#include <string.h>
定义了几个操作C字符串和数组的函数。
不包括扩展名。
某些头文件没有附加.h。您通常会看到包含模板的头文件。
答案 3 :(得分:1)
关于使用尖括号和引号之间的区别,我认为它与查找头文件的顺序有关:如果它在引号之间,编译器将首先检查工作目录(不是很在检查系统头目录之前,在系统头文件中很有用,因为它们与编译器不在同一目录中。
答案 4 :(得分:1)
关于包含在尖括号和引号中的包含之间的区别,第一个指示预处理器首先沿/ I编译器选项指定的路径搜索包含文件。第二个告诉预处理器在包含#include语句的文件的同一目录中查找包含文件。