在 C++ 中你应该包括cstring
作为标题,而在 c 中你应该包括string.h
作为标题。
In C++
#include <cstring>
In C
#include <string.h>
C 标准库的功能也在 C++ 标准库中提供,并且作为通用命名约定,它们前面加上一个c
到C标准库中的相应名称。
例如:
string.h
变成cstring
stdio.h
变成cstdio
等等...
由于其他答案为这次讨论增加了不同的维度,我觉得有必要参考神圣的标准来澄清这一点。
As per C++11 20.9.14.6 和 7:
表 55 描述了标头<cstring>
.
内容与标准 C 库头相同,但更改为memchr()
21.7 中规定。
While 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) 内声明或定义,然后通过显式 using 声明 (7.3.3) 注入全局命名空间范围。
3 [ 示例:标题<cstdlib>
确实在命名空间 std 中提供其声明和定义。它还可以在全局命名空间内提供这些名称。标题<stdlib.h>
确实在全局命名空间中提供了相同的声明和定义,就像在 C 标准中一样。它还可以在命名空间 std 中提供这些名称。 —结束示例]
结论:
从以上参考资料来看:
我对我之前的建议进行了纠正,使用似乎没有明显的优势cstring
over string.h
而正如 @Alf 所建议的,由于在使用时使用不合格的函数名称,可能会出现一些编译问题cstring
作为标题。因此考虑到使用没有明显的缺点string.h
或使用的优点cstring
,我认为如果使用得当的话,两者都可以在 C++ 中使用。