<string.h>或<string>?

21

在C++项目中包含标准头文件string.h,最好的方法是什么?应该使用结尾处的[dot]h,如下所示:

#include <string.h>

或者只是写作

#include <string>

或者,也许可以使用我不知道的另一种方法?

谢谢!


8
那些实际上是不同的文件。是的,这让我头疼。 - Chris Eberle
6个回答

59

这是两个不同的头文件。

  • <string> 是为了 C++ 的 std::string 类。
  • <string.h> 是为了 C 字符串函数(如 strlen() 等),对于 C++ 项目应该使用 <cstring> (这是第三个,你可能不知道)。

2
使用<cstring>而不是<string.h>并不是一个好主意。这样做除了增加代码的脆弱性外,没有任何好处,因为<cstring>不能保证不污染全局命名空间。拥有一个非污染的全局命名空间是<cstring>的最初动机,但据我所知,没有编译器实现了这一点,并且在C++11中,这种保证已经消失了。 - Cheers and hth. - Alf
1
@Michael:我在评论回答,目前回答中写着“对于 C++ 项目应该是 <cstring>”。这是错误的信息。现在你已经意识到这一点,却拒绝重新考虑,从某种程度上说是好事:读者可以确定你的建议没有基于任何理性评估。 - Cheers and hth. - Alf
1
你说得有道理。关键是,我的建议应该考虑到你对我的个性评估,这个评估基于我拒绝在你的反对代码脆弱性的斗争中站在你这一边,而是给我们两个人自由选择。我们就此打住,让读者自行决定。 - Michael Krelin - hacker
1
正如Alf指出的那样,使用C++时可以选择使用<string.h>或<cstring>。但<cstirng>并不是一个类库,而是<string.h>在C++中的一种别名。简而言之,如果要使用strcmp()、strcat()等函数族,则需要根据语言和/或偏好包含<string.h>或<cstring>;如果要使用std::string类,则需要包含<string>。 - Michael Krelin - hacker
1
@Brian,我会说“使用'cin'和'cout'的C语言”可能意味着没有std::string。 - Michael Krelin - hacker
显示剩余4条评论

8

这是有很大的区别的!

<string.h> 是C风格字符串所用的库。

<string> 是C++字符串所用的库。

按照C++标准,你应该使用 <cstring> 而不是 <string.h>


“按照C++标准,你应该使用<cstring>而不是<string.h>”,但实际上C++标准并没有这样规定。 - Cheers and hth. - Alf
通过使用<cstring>,你将C风格的字符串函数放入了std命名空间中,好吗? - triclosan
是的,这样做可能没问题,但您无法保证它们不会被放入全局命名空间中。结果是,使用一个编译器可以工作的代码可能无法在另一个编译器上编译。这不是一个很好的想法。 - Cheers and hth. - Alf

2

维基百科 上提到:

C++标准库还包含了18个以".h"结尾的ISO C90 C标准库头文件,但它们已经过时。C++标准库中的所有其他头文件不会以".h"结尾。

每个来自C标准库的头文件在C++标准库中都有一个不同的名称,通过删除.h并在开头添加'c'而生成;例如,'time.h'变成了'ctime'。


1

string是C++标准模板库头文件,提供了模板类'string';string.h是C标准头文件,提供了许多函数可供使用,如strlen、strcpy、memcpy等。如果你想在命名空间std中使用它,而不是使用全局命名空间或不想使用string.h,那么可以使用cstring代替。


0

*.h头文件通常是C头文件,您可以在C++中使用extern "C" { ... }进行包装。

没有任何*.h的头文件通常是真正的C++头文件。

这只是一个经验法则。

最新和以前的C++标准(c++11、C++03)定义了像<cstdio>这样的头文件,以适当地包装原始的C头文件,使用命名空间等。


1
“最新的C++标准”……之前的标准也是这样。 - Michael Price

-3

标准是

#include <string>

7
+1 用于抵消匿名的负评。注意:这个答案是错误的,我原本会给它负评的,但是匿名负评者比我更快。我认为未经解释的负评足以产生足够的破坏和负面影响,因此即使有明显的好理由,也应该予以反制。 - Cheers and hth. - Alf
2
@AlfP.Steinbach:匿名的负评有改变答案排序的有用功能。匿名的负评比评论不那么有用,但我不认为它们会对答案造成积极的伤害。 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接