这段代码为什么会出现问题
std::map <std::string , int> m;
m["a"]=1;
可以编译(我使用的是MSVC 2010)
#include <string>
但不能使用
#include <string.h>
?
这段代码为什么会出现问题
std::map <std::string , int> m;
m["a"]=1;
可以编译(我使用的是MSVC 2010)
#include <string>
但不能使用
#include <string.h>
?
<string.h>
包含了一些旧的函数,例如用于 C 风格的以空字符结尾的字符串的 strcpy
和 strlen
。<string>
主要包含了 std::string
、std::wstring
和其他类。string.h
是C语言头文件,不是C++头文件,没有例外!
<string> 是 C++ 的头文件,而不是 C 的头文件。
- iammilind<string.h>
是C字符串库 - http://www.cplusplus.com/reference/clibrary/cstring/
<string>
是C++字符串类 - http://www.cplusplus.com/reference/string/
根据Nicol Bolas评论和一些谷歌搜索,<cstring>
通常会将与<string.h>
相同的内容导入到std
命名空间中。
<string.h>
通常会将所有内容导入全局命名空间。
但是根据我的谷歌搜索结果,这似乎取决于您使用的库实现。
就我个人而言,只有在需要C风格字符串帮助程序时才使用<cstring>
。
<cstring>
不是<string.h>
的同义词。<cstring>
将内容放置在std
命名空间中(也可能将它们留在std
命名空间之外),而<string.h>
则不会这样做。 - Nicol Bolas.h
头文件已经被弃用。 - Prasoon Sauravstring.h
是C语言的头文件,而string
则是C++语言的头文件。
<string.h>
也可以被视为 C++ 的头文件。 :) - iammilind<string.h>
包含C库字符串函数,例如strlen
,strcmp
等。
<string>
包含std::basic_string
的定义,其中有typedefs std::string
和std::wstring
。这就是区别所在。
除了它们都处理字符串之外,它们实际上没有任何关系。
这两个是完全不同的头文件。
<string>
是C++中的 string
类。
<string.h> 或者 <cstring>
定义了操作C字符串和数组的函数。
如上所述,string.h
和cstring
是C头文件(而cstring
基本上是string.h
的C++包装器),包含用于C字符串的函数,这些字符串是以'\0'
结尾的char[]
。您需要使用C++类字符串,其头文件为<string>
。
我认为<string.h>
只适用于C语言,而<string>
适用于C++语言。因此,包含string.h
是行不通的。
在C中,要使用旧的C风格字符串特性(包括strlen(char*)
),我们写成这样:
// C
#include <string.h>
这是C中唯一的方法。包含这个头文件将在全局范围内定义和声明一些实际的函数(如strlen
,strcmp
,...)。
在C++中,这种包含方式继续存在,因为C++编译器应该与大多数(99%)的C代码兼容。以下相同的代码包含了旧的C风格字符串特性(包括strlen(char*)
):
// C++
#include <string.h>
在C++中,为了避免混淆,语言团队将旧的头文件重命名为遗留文件,我们建议写成这样,而不是2.:
// C++
#include <cstring.h>
或者,由于C++倾向于省略末尾的“.h”,我们可以写成这样:
// C++
#include <cstring>
strlen(char*)
)的相同事物。std::string
。<string>
本身导入了<cstring>
(在大多数编译器中)。因此,对于使用旧的C风格字符串特性,我所提供的五个示例都可以正常工作,没有错误。要使用新的C++字符串类,同样,<string>
是唯一的方法。#include <string.h>
实际上(或者可能是)等同于#include <cstring>
。正如其他答案中指出的那样。 - undefined<string>
通常包括string.h
,但据我所知,并不要求标准这样做。但我可能错了。 - undefined<string.h>
是 C 标准库头文件,而 <string>
则是 C++ 的。实际上,所有的 C 标准头文件都有 .h
扩展名,而没有一个 C++ 头文件有 .h
扩展名。
string.h
已经被弃用。如果您需要其中包含的功能,则应该使用头文件cstring
。这基本上完全绕过了“这两者之间有什么区别”的问题,因为很明显其中一个来自C库。 - Mike Bailey