在C ++标准库中使用C字符串

时间:2016-04-21 16:24:45

标签: c++ std

我想知道在C ++标准库中使用C字符串的原因是什么?直观地说,在std库中使用std::string是有意义的(例如fstream)。

每当我想写一些好看的C ++代码时,我都不确定是否应该从C字符串开始,使用std::strings并在需要时用c_str()转换它们,或者使用其他一些方法

4 个答案:

答案 0 :(得分:2)

According to Stroustrup,C ++的C兼容性是一个关键的语言设计决策。这就是C字符串首先进入语言的方式。当时有些库函数开始接受C字符串作为参数。

然而,随着语言及其标准库的成熟,替换C字符串的重载被添加到许多函数中,包括您在帖子中提到的std::fstream的构造函数。

此时,人们可能想要使用C字符串的主要原因是与C库的互操作性。

答案 1 :(得分:1)

在实践中,所有字符串类都可以转换为C字符串和从C字符串转换,而在底层,针对OS API,它是规则的C字符串。

因此,std::basic_string变体的要求会要求程序员为他们可能不使用的东西支付(转换成本,如果没有别的,还有标题和库依赖性)。在使用某些框架(如Qt或MFC)构建的特定应用程序中,倾向于使用该框架的字符串类型。

更值得注意的是,IMO认为std::string被接受,std::wstring几乎没有支持。在实践中,不包括Windows,其中文件名是UTF-16编码的。当Boost文件系统最终进入标准库时,我们会遇到一种奇怪的情况(我记得提案中有关于条件支持的语言,条件= Windows)。

答案 2 :(得分:1)

我只能回答,因为你的问题非常具体。

C ++标准库的许多部分与std::string没有很好的集成,因为这两个部分是在1998年标准化的过程中独立开发的。

近年来这种情况有所改善,std::fstream在C ++ 11中被赋予std::string构造函数。

可能仍然使用char数组的其他区域是所需要的只是一个简单的字符序列而没有字符串功能;强制要求动态分配,以及那些对用户不友善的东西。

答案 3 :(得分:1)

我没有参与C ++标准库的设计,所以我不能说为什么做出任何特定的决定,但我可以理解设计决策的(dis)优势。

C ++旨在与C互操作,而处理C最常见的是处理C字符串。 C字符串仍然有用,有时是唯一的选择。

现在,C ++可以提供一个标准库接口,要求您将const std::string<char>&传递给像std::fstream构造函数这样的东西。但这会迫使所有用户将其所有C字符串转换为std::string,这需要复制效率低下的整个缓冲区。如果我可以概括一下,许多C ++用户都非常关注性能,所以从他们的角度来看这不是一件好事。

std::string获取C字符串是微不足道的,因此C ++标准库的设计可以选择提供接受C字符串的接口,这允许用户使用他们的C字符串而无需转换,但仍然允许std::string的用户轻松使用该界面。这是在std::fstream构造函数的情况下在标准的原始版本中选择的。

因为C ++支持重载,所以C ++标准库的设计也可以选择为C字符串和std::string提供重载。对于std::string的用户来说,这样做的优点是稍微简单一点,但是稍微膨胀API的缺点。在C ++ 11修订版中,重载接受const std::string&已添加到std::fstream构造函数中。

  

每当我想写一些好看的C ++代码时,我都不确定是否应该从C字符串开始

然后让我向您保证:在C字符串上使用std::string几乎总是一个不错的选择。与C库交互的典型例外(但不是唯一)。