【问题标题】:Why does my program compile successfully if I don't include <string.h>?如果我不包含 <string.h>,为什么我的程序编译成功?
【发布时间】:2020-08-07 00:46:01
【问题描述】:

我已经对此感到困惑了一段时间。为了测试这一点,我制作了一个简单的程序,它只创建了一个 std::string 变量并将其打印到屏幕上。但是,它不包括 .

#include <iostream>

using namespace std;

int main()
{
        string name = "Test";
        cout << name << endl;
        return 0;
}

让我感到困惑的是,这个程序可以完美地编译和运行。现在我正在使用 XCode 开发工具附带的clang 编译器。这是预期的行为吗?我希望这个问题不会太荒谬,因为我刚开始学习 C++。

【问题讨论】:

  • &lt;iostream&gt; 包括&lt;string&gt;
  • @Barmar 它可以包含它。
  • 注意:似乎与他对您的问题的回答没有直接关系,但重要的是要注意 C++ 中的正确标头是 &lt;string&gt; 而不是 &lt;string.h&gt;
  • @Barmar 确实如此,但评论不是“&lt;iostream&gt; 在这种情况下包括&lt;string&gt;”。我认为最好指明这与语言无关。

标签: c++ string iostream


【解决方案1】:

您不需要包含#include &lt;string.h&gt; 头文件的原因是因为当您包含#include &lt;iostream&gt; 头文件时,它包含std::string

但是,不要依赖它。可能对您的编译器有效的东西可能不适用于另一个。始终包含正确的头文件。

要编辑您的示例,您应该使用它:

#include <iostream>
#include <string>


int main()
{
        std::string name = "Test";
        std::cout << name << std::endl;
        return 0;
}

另请注意:为什么不应该使用using namespace std;

【讨论】:

    【解决方案2】:

    如果我不包含&lt;string.h&gt;,为什么我的程序编译成功?

    因为您没有使用来自&lt;string.h&gt; 的任何定义/声明。

    程序完美编译并运行...这是预期的行为吗?

    这是偶然的行为。

    无法保证一个标准标头不会包含其他标准标头。碰巧&lt;iostream&gt; 在这个特定版本的标准库中包含了&lt;string&gt;。由于无法保证这一点,因此依赖这种传递包含是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2023-03-07
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多