string.h和cstring之间的区别?

string.hcstring什么区别?

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

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

在C ++中

 #include  

在C.

 #include  

C标准库中还提供了C标准库的function,作为一般命名约定,它们由c标准库中的相应名称预先设置。

例如:
string.h成为cstring
stdio.h成为cstdio等等……


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

根据C ++ 11 20.9.14.6和7

表55描述了头文件
内容与标准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所示。

其中包括:

进一步,

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

3 [示例:标头确定在命名空间std中提供其声明和定义。 它还可以在全局命名空间中提供这些名称。 头文件肯定在全局命名空间中提供相同的声明和定义,就像在C标准中一样。 它还可以在命名空间std中提供这些名称。 – 示例]

结论:

从以上参考资料:
我在之前的建议中得到了纠正,似乎没有明显的优势,在string.h上使用cstring ,而@Alf建议,当使用cstring作为头文件时,由于使用了不合格的函数名称,可能会出现一些编译问题。 因此,使用string.h或使用cstring的优势没有明显的优势,我认为如果以正确的方式使用,可以在C ++中使用。

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

string.hcstring之间有一个细微的区别

回答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 ++中列出了所有18个用于与C兼容的头文件,在C ++ 98规范中: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版本有一些差异。 在C语言中,某些类型是作为typedef实现的,但是对于C ++来说,它可以防止模板特化等事情对这些类型*进行处理,因此C ++会将一些C类型的构造转换为实际类型。 这意味着包含这些typedef的C ++版本的C ++必须省略它们。

C ++还允许重载,因此C ++版本的指定C函数的一些重载,以允许函数返回指向非const数据的指针,如果输入参数是指向非const数据的指针,而C函数需要并仅返回指向const的指针。

我想,但是现在无法找到标准中的位来validation这一点,标头的C ++版本必须将它们的名称放在std命名空间中,并且只将它们作为可选扩展名放在全局命名空间中。

*例如以下代码:

 typedef int Foo; template struct Bar {}; template<> struct Bar {}; template<> struct Bar {}; 

导致以下错误:

 main.cpp:7:19: error: redefinition of 'Bar' template<> struct Bar {}; ^~~~~~~~ main.cpp:5:19: note: previous definition is here template<> struct Bar {}; ^ 1 error generated. 

在C中,wchar_t是一个typedef,因此这将阻止一个特殊化应用于wchar_t,但不能用于wchar_t使用的任何底层类型。 MSVC 2010将char32_t和char16_t实现为typedef这一事实阻止了它们为这些类型提供std :: codecvt特化。

显然cstring用于C ++, string.h用于C.

值得一提的是,如果要从string.h切换到cstring ,请记住在所有字符串函数调用之前添加std::