Alo*_*ave 21
在C++中,您应该包含cstring标题,而在c中您应该包含string.h标题.
在C++中
#include <cstring>
Run Code Online (Sandbox Code Playgroud)
在C.
#include <string.h>
Run Code Online (Sandbox Code Playgroud)
C标准库中还提供了C标准库的功能,作为一般命名约定,它们由cC标准库中的相应名称预先设置.
例如:
string.h变cstring
stdio.h变cstdio等...
由于其他答案为本次讨论增加了不同的维度,我觉得有必要参考神圣的标准来澄清这一点.
根据C++ 11 20.9.14.6和7:
表55描述了标题
<cstring>.
内容与标准C库头相同,更改为memchr()21.7中指定.
而21.7空终止序列实用程序指出:
函数签名
memchr(const void*, int, size_t)应由两个声明替换:Run Code Online (Sandbox Code Playgroud)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++中使用.
string.h和cstring之间有细微的区别
Alf P. Steinbach 的回答(可以作为对所问问题的评论找到):
string.h将标识符放在全局命名空间中,也可以将它们放在标准命名空间中。虽然cstring将标识符放在标准命名空间中,也可以将它们放在全局命名空间中。您绝对不希望出现这种cstring行为,因为例如使用的代码strlen可能在一个编译器上运行良好,然后在另一个编译器上编译失败。这是非常不愉快的惊喜。所以对于C 和 C++,使用更安全的string.h.
您可以将 string.h 用于 C 和 C++。
在C++ 98规范中,它定义了cstring(在主规范中)和string.h(在附录D.5,标准C库头文件中,为了兼容性),它们定义了一些与C中的string.h相同的字符串函数。在现实世界中,所有 C++ 编译器都会提供 string.h 以兼容 C 代码。
所以,在我看来,由于 C++ 代码可能由 C 程序员维护,并且来自 C 的习惯,我更喜欢 string.h。它足够清晰,广为人知,并且更具兼容性(与 C)。
顺便说一句,我在 C++ 98 规范中列出了 C++ 中的所有 18 个标头,以与 C 兼容:assert.h、iso646.h、setjmp.h、stdio.h、wchar.h、ctype.h、limits.h、signal。 h、stdlib.h、wctype.h、errno.h、locale.h、stdarg.h、string.h、float.h、math.h、stddef.h、time.h
在 C++ 中,C 语言头文件定义在命名空间 std 下。因此,如果您在 C++ 中使用这些标头,请使用 cstring 并消除 .h 。
| 归档时间: |
|
| 查看次数: |
23528 次 |
| 最近记录: |