【问题标题】:Is string header file needed anymore? [duplicate]是否不再需要字符串头文件? [复制]
【发布时间】:2019-08-13 16:29:02
【问题描述】:

所以我现在正在学习 C++,并且在某些时候我看到你“必须”在代码顶部使用 #include <string> 才能使用字符串。但是当我运行我的代码时,它在两种情况。那么它真的需要使用它吗?

#include <iostream>
using namespace std;

int main() 
{
    string fullName;
    cout << "Type your full name: "; 
    getline(cin, fullName);
    cout << "Your name is: " << fullName;

}

【问题讨论】:

  • 请出示您的代码。
  • 简短的回答是肯定的,您确实需要包含标题。我的猜测是您正在包含另一个标题,该标题本身包含 string 一个。没有看到你的代码,我们无法给你一个明确的答案。

标签: c++ string header


【解决方案1】:

一些编译器实现在标头&lt;iostream&gt; 中包含标头&lt;string&gt;

但是你不能依赖这个。

【讨论】:

    【解决方案2】:

    如果您不接受,则不需要编译器来接受您的程序。

    它可能(巧合地)通过不同的标头包含并且无论如何都可以工作,但在您的下一次编译器更新或移动到不同的平台后可能不是这种情况。

    你是否“必须”包括它主要取决于你工作的环境有多严格——如果你在家黑客,你可以做任何事情,但如果你为别人工作,你就是通常期望做正确的事。

    【讨论】:

    • “如果你不接受你的程序就不需要编译器”是什么意思?
    • 我在尝试编译代码时收到了StorMy.cpp:6:5: error: unknown type name 'string'。这是一个编译器不接受程序的例子。 (我可以通过添加 using namespace std::__private; 来修复它,但这会阻碍 __private 命名空间的用途。)
    • @BrandonDyer 允许这样做,例如第二段中提到的原因,但不是必须的。
    • @TedLyngmo • 我正在使用我的破解版clang++,我已经添加了一堆工具。用于慢速程序。我修改后的标头只有他们需要提供的符号,除此之外什么都没有(因此,由于全局命名空间中不存在不需要的符号而导致很多失败)。随着时间的推移,clang-iwyuclang-format 以及更好的 -fsanitize 支持等功能变得越来越没用。 newnew[]malloc 的单独堆。
    • @Eljay Darn ... 雄心勃勃! :-)
    【解决方案3】:

    不要依赖传递包含。您的实现可能在其他标头中包含它想要的任何内容,可能导致您的代码工作,但您不能依赖它。一个好的、可移植的、健壮的程序包括它所需要的,当它需要时,明确。这样,当您更改编译器、标准库、操作系统等时,它仍然可以工作。

    【讨论】:

      【解决方案4】:

      在 C++ 中,#include 只是说将包含文件中的代码粘贴到该位置。如果某些东西已经是#includeing 字符串,那么编译器不会关心它包含它之后是否有任何内容。

      这并不意味着您应该这样做!始终包含您需要的内容。不要依赖其他标头,尤其是来自库的标头,包括适合您的任何标头。

      【讨论】:

        猜你喜欢
        • 2019-05-27
        • 1970-01-01
        • 2011-03-03
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 2011-02-16
        • 2010-10-21
        相关资源
        最近更新 更多