<cstring>和<string>有什么区别?

60

今天早些时候(由于我的时区实际上是昨天)我在Interview Street上,使用Visual Studio 2012进行C++编程面试(该平台使用g++)。

简单来说,在我的编程过程中遇到了几个编译错误1

#include <cstring>

这段代码是从一个问题的骨架代码中提供的,经过修改后变成了

#include <string>

所有编译错误都神奇地消失了。

然而,当我提交到Interview Street时,我不得不再添加c;否则我就会得到编译错误。

这是我第一次被非标准化所困扰....

我的问题是:在<string><cstring>中有什么让我(宝贵的)超过半个小时?


1 对于任何好奇的人:

如果using <cstring>,Visual Studio 2012的一个错误是:

error C2338:C++标准不为此类型提供散列。

出现在

c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstddef

可能是unordered_map中以string为键值。

如果using <string>,g ++的一个错误是:

'strlen' was not declared in this scope

3个回答

56

cstring 头文件提供了处理C风格字符串的函数,包括处理以空字符结尾的字符数组的函数,例如 strlenstrcpy。它是C++版本的经典string.h头文件。

string头文件提供了std::string类及相关函数和运算符。

这两个头文件名称相似,但实际上它们除此之外没有任何关系,它们覆盖不同的任务。


2
谜题是:g++ 似乎不需要 <string> 来使用 string,而 Visual Studio 则不需要 <cstring> 来使用 c 的东西。为什么? - Dante May Code
5
C++标准允许标准头文件包含其他标准头文件,因此您可以从已经包含的其他头文件(例如iostream)中获取string的内容。cstring同理。请始终包含所有所需的头文件。不要依赖于特定环境隐式地为您包含某些头文件;如果需要使您的代码可移植,或者如果更改编译器版本并且新版具有不同的隐式头文件依赖项,则会遇到问题。 - Rob Kennedy
8
实现可以在其头文件中包含其他头文件。很可能VS会在您包含的某些其他头文件中添加#include <cstring>,而gcc会在您所包含的某个头文件中添加#include <string>。您应该同时包含这两个头文件,因为您的代码依赖于它们。 - David Rodríguez - dribeas

7

<cstring> 包含了来自 C 头文件 string.h 的 C 字符串代码。在 C++ 中,有一个约定,即 C 头文件具有相同的基本名称,除了前面有一个 c 并且没有后缀 .h。所有内容都在 std:: 命名空间下可用。

<string> 包含了标准库 std::string 和相关函数。


1
谜题是:g++ 似乎不需要 <string> 来使用 string,而 Visual Studio 则不需要 <cstring> 来使用 c 的东西。为什么? - Dante May Code
1
如果需要使用<string>,则必须在不同的头文件中包含它。如果需要使用它,应该始终包含<string>。我认为没有任何标准头文件可以保证包含它。 - juanchopanza

5
在C++中,你不会使用#include <somefile.h>,而是使用#include <somefile>。现在C++在<string>中有它自己的字符串类,但c字符串函数也是可用的,这些函数在<string.h>中。C++使用<cstring><string>来包含传统的c- include文件。因此,http://www.cplusplus.com/reference/clibrary/cstring/

谜题是:g++ 似乎不需要 <string> 来使用 string,而 Visual Studio 则不需要 <cstring> 来处理 C 相关的内容。为什么呢? - Dante May Code
2
@DanteisnotaGeek 很好的问题。MSVC一直有点奇怪。 - Rudolf Mühlbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接