string.h和cstring有什么区别?
哪一个应该用于C,哪个应该用于C++ (如果有的话)?
发布于 2011-12-05 11:55:11
在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(标准)兼容性特性描述:
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标头,每个标头都有一个格式为using
name.h**,的名称,就好像由相应的**cname header放置在标准库命名空间中的每个名称都放在全局命名空间范围内一样。未指定这些名称是首先在命名空间标准的命名空间作用域(3.3.6)内声明还是定义,然后通过显式-声明(7.3.3)注入到全局命名空间作用域中。
3示例:头<cstdlib>肯定在名称空间std中提供了它的声明和定义。它还可以在全局名称空间内提供这些名称。头<stdlib.h>在全局名称空间中肯定提供了相同的声明和定义,与C标准中的声明和定义非常相似。它还可以在命名空间std中提供这些名称。-end示例
结论:
从上面的引用中:
我纠正了我之前的建议,使用cstring比使用string.h似乎没有明显的优势,而正如@Alf建议的那样,当使用cstring作为头文件时,由于使用非限定函数名,可能会出现一些编译问题。因此,考虑到使用string.h没有明显的缺点或使用cstring的优点,我认为如果使用得当,两者都可以在C++中使用。
发布于 2011-12-05 12:13:54
H和cstring之间有细微的区别
Alf P. Steinbach的答案(可以作为对所问问题的评论):
string.h将标识符放在全局名称空间中,也可以将它们放在标准名称空间中。而cstring将标识符放置在标准命名空间中,并且也可以将它们放置在全局命名空间中。你肯定不想要这种cstring行为,因为例如只使用strlen的代码可能在一个编译器上工作得很好,然后在另一个编译器上编译失败。这是非常令人不快的惊喜。因此,对于C和C++,请使用更安全的string.h。
发布于 2011-12-05 11:54:48
在C++中,C语言头是在名称空间std下定义的。因此,如果您在C++中使用这些头文件,请使用cstring并删除.h。
https://stackoverflow.com/questions/8380805
复制相似问题