string.h和cstring之间的区别?

Beg*_*ner 17 c c++

string.h和之间有什么区别cstring

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

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.hcstring
stdio.hcstdio等...


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

根据C++ 11 20.9.14.6和7:

表55描述了标题<cstring>.
内容与标准C库头相同,更改为memchr()21.7中指定.

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);
Run Code Online (Sandbox Code Playgroud)

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

附件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中提供这些名称. - 末端的例子]

结论:

从上面的引用:
我站在我前面的建议纠正,似乎有使用没有明显的优势,cstringstring.h同时作为@Alf建议有可能是由于使用时使用不合格的函数名的一些编译问题cstring作为标题.因此,如果使用string.h或使用优势没有明显的优势cstring,我认为如果以适当的方式使用,可以在C++中使用.

  • @ julio.alegria否.不不不不不. (5认同)
  • @ julio.alegria:**这可能并不意味着它是正确的**,是你应该学习的C++编程语言的一个重要特征. (4认同)
  • @Als等人:使用[cstring]作为[string.h]的*替代*没有任何优点和一些严重的缺点,例如代码无法与其他编译器一起编译.所以在任何一个或者视图中,唯一合理的选择是[string.h].我不确定它是否有任何实际的优势包括两者.也许.但是只有1,那么[string.h].干杯, (2认同)
  • @Nicol:我已经举了一个例子.但无论如何,使用任何[string.h]函数不合格的代码,例如`strlen`,*可能*用[cstring]编译,并且可能会编译.因为在C++ 11中,允许[cstring]随意丢弃全局命名空间.使用其他一些编译器和一个清理器[cstring]然后传统的(我应该说习惯?)调用无法编译.使用C++ 03 [cstring]不允许以这种方式污染全局命名空间,这是标题的*整点*.然而,AFAIK没有人实施,所以它仍然完全没有意义......非常具有讽刺意味. (2认同)

Beg*_*ner 6

string.hcstring之间有细微的区别

Alf P. Steinbach 的回答(可以作为对所问问题的评论找到):

string.h将标识符放在全局命名空间中,也可以将它们放在标准命名空间中。虽然cstring将标识符放在标准命名空间中,也可以将它们放在全局命名空间中。您绝对不希望出现这种cstring行为,因为例如使用的代码strlen可能在一个编译器上运行良好,然后在另一个编译器上编译失败。这是非常不愉快的惊喜。所以对于C 和 C++,使用更安全的string.h.

  • `因为例如只使用 strlen 的代码可能在一个编译器上可以正常工作,然后在另一个编译器上编译失败。我发现在 Visual Studio 下编译而没有警告或错误的代码将在 GCC 中失败,因为某些 VS 头文件会隐式包括诸如 `memcpy` 之类的东西,而 GCC 不会。所以我不明白标题的不当使用是如何选择一个而不是另一个的原因;你不能保证自己什么。如果你包含 `c*` 版本,那么你应该使用 `std::` 命名空间限定名称。如果你不是,那么你会得到你应得的。 (2认同)

Goo*_*gol 5

您可以将 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


Jag*_*ath 4

在 C++ 中,C 语言头文件定义在命名空间 std 下。因此,如果您在 C++ 中使用这些标头,请使用 cstring 并消除 .h 。

  • “在 C++ 中,C 语言头文件是在命名空间 std 下定义的” &lt;- 这是不正确的 (2认同)