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

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

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

#include <iostream>

using namespace std;

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

令我困惑的是这个程序编译和运行完美。现在,我正在使用 XCode 开发人员工具附带的 clang 编译器。这是有意的行为吗?我刚开始学C++,希望这个问题不要太可笑

您不需要包含 #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;

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

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

program compiles and runs perfectly ... Is this intended behavior?

这是偶然的行为。

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