<cstring>和<string>之间的区别

Dan*_*ode 47 c++ g++ visual-studio

今天早些时候(实际上昨天由于我的时区)我在Interview Street上使用Visual Studio 2012 for C++(使用g ++)尝试编程访谈.

简而言之,我在使用时遇到了几个编译错误1

#include <cstring>
Run Code Online (Sandbox Code Playgroud)

这是由一个问题中的骨架代码提供的,之后转向

#include <string>
Run Code Online (Sandbox Code Playgroud)

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

但是,在提交到Interview Street后,我不得不加c回来; 否则我有编译错误.

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

我的问题是:什么内部<string><cstring>我(珍贵)超过半小时?


1对于任何好奇的人:

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

错误C2338:C++标准不为此类型提供哈希.

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

可能string是关键的unordered_map

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

'strlen'未在此范围内声明

Rob*_*edy 43

所述cstring头部提供的功能与C语言风格的处理字符串-字符空终止阵列.这包括strlen和和等功能strcpy.这是来自C的经典string.h标题的C++版本.

所述string头提供的std::string类和相关功能和操作符.

标题有相似的名称,但除此之外它们并没有真正相关.它们涉及单独的任务.

  • @DanteisnotaGeek:允许实现在其标题中包含其他标头.很可能VS在你包含的一些其他头文件中添加了`#include <cstring>`,gcc在你包含的某些头文件中添加了`#include <string>`.你*应*包括******因为你的代码取决于两个标题. (6认同)
  • C++标准允许标准头文件包含其他标准头文件,因此您可以从已经包含的任何其他头文件中获取`string`的内容,例如`iostream`.同样对于`cstring`.始终包含*all*您需要的标题.不要依赖于您的特定环境来隐含地为您包含其中的一些; 如果您需要可移植的代码,或者如果您更改编译器版本并且新版本具有不同的隐式头依赖项,则会遇到问题. (5认同)
  • 难题是:对于`string`,g ++似乎不需要`<string>`,而对于c的东西,Visual Studio似乎不需要`<cstring>`.为什么? (2认同)

jua*_*nza 6

<cstring>具有C头string.h中的C字符串代码.C++有一个约定,其中C标题具有相同的基本名称,除了前导c和没有尾随.h.所有内容都在std::命名空间下可用.

<string>有标准的库std::string和相关的功能


Rud*_*uer 5

在 C++ 中,您不会使用#include <somefile.h>, 而是#include <somefile>. 现在 C++<string><string.h>. C++ 用于“传统”c-包含文件。因此,<cstring><string>

http://www.cplusplus.com/reference/clibrary/cstring/

  • @DanteisnotaGeek 好问题。MSVC 总是有点奇怪。 (2认同)