string.h 和 cstring 之间的区别?

新手上路,请多包涵

string.hcstring 有什么区别?

哪个应该用于 C,哪个用于 C++(如果有的话)?

原文由 Roman Byshko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 506
1 个回答

在 C++ 中,您应该包括 cstring 作为标头,而在 c 中,您应该包括 string.h 作为标头。

在 C++ 中

#include <cstring>

在 C 中

#include <string.h>

C 标准库的功能也在 C++ 标准库中提供,并且作为一般命名约定,它们在 C 标准库中的相应名称前 c

例如:

string.h 变成 cstring

stdio.h 变成 cstdio 等等…


由于其他答案为这个讨论增加了不同的维度,我觉得有必要参考神圣的标准来清除这一点。

根据 C++11 20.9.14.6 & 7

表 55 描述了标题 <cstring>

内容与标准 C 库头文件相同,但在 21.7 中指定为 memchr()

虽然 21.7 空终止序列实用程序 指出:

函数签名 memchr(const void*, int, size_t) 应替换为两个声明:

 const void* memchr(const void* s, int c, size_t n);
void* memchr( void* s, int c, size_t n);

两者都应具有与原始声明相同的行为。

附件 D(规范性)兼容性特性 [depr] 规定:

D.6 C 标准库头文件

1 为了与 C 标准库和 C Unicode TR 兼容,C++ 标准库提供了 25 个 C 标头,如表 151 所示。

其中包括:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h> <complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h> <ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h> <errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h> <fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

进一步,

2 每个 C 头文件,每个头文件都有一个 name.h 形式的名称,其行为就像每个由相应的 cname header 放置在标准库命名空间中的名称都放置在全局命名空间范围内. 未指定这些名称是否首先在命名空间 std 的命名空间范围 (3.3.6) 内声明或定义,然后通过显式使用声明 (7.3.3) 注入全局命名空间范围。

3 [ 示例:标题 <cstdlib> 确实在命名空间 std 中提供了它的声明和定义。它还可以在全局命名空间中提供这些名称。标题 <stdlib.h> 确实在全局命名空间中提供了相同的声明和定义,就像在 C 标准中一样。它还可以在命名空间 std 中提供这些名称。 —结束示例]

结论:

从以上参考资料:

我对我之前的建议进行了纠正,似乎使用 cstring --- 而不是 string.h 似乎没有明显的优势,而正如@Alf 建议的那样,由于使用不合格的函数名称可能会出现一些编译问题使用 cstring 作为标题时。因此,鉴于使用 string.h 或使用 --- 没有明显的 cstring ,我认为如果以适当的方式使用,两者都可以在 C++ 中使用。

原文由 Alok Save 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题