如果我不包含 <string.h>,为什么我的程序编译成功?

Why does my program compile successfully if I don't include <string.h>?

提问人:mochimochi 提问时间:8/7/2020 最后编辑:Geno Cmochimochi 更新时间:8/7/2020 访问量:264

问:

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

#include <iostream>

using namespace std;

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

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

C++ 字符串 IOSTREAM

评论

1赞 Barmar 8/7/2020
<iostream>包括<string>
3赞 François Andrieux 8/7/2020
@Barmar 它可以包括它。
2赞 user4581301 8/7/2020
软件工程的相关问题表单:依赖可传递包含标头是否是一种好的做法?
2赞 8/7/2020
注意:似乎与他对您的问题的回答没有直接关系,但重要的是要注意 C++ 中的正确标题不是 .<string><string.h>
1赞 François Andrieux 8/7/2020
@Barmar 确实如此,但评论不是“ 在这种情况下包括”。我认为最好说明这不是关于语言的事实。<iostream><string>

答:

1赞 Geno C 8/7/2020 #1

您不需要包含头文件的原因是,当您包含头文件时,它包括 .#include <string.h>#include <iostream>std::string

但是,不要依赖它。在编译器上可能有效的方法可能在另一个编译器上不起作用。始终包含正确的头文件。

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

#include <iostream>
#include <string>


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

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

-1赞 eerorika 8/7/2020 #2

如果我不包含,为什么我的程序编译成功?<string.h>

因为您没有使用任何定义/声明。<string.h>

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

这是偶然行为。

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