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



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

#include <iostream>
using namespace std;
int main()
{
string name = "Test";
cout << name << endl;
return 0;
}

让我困惑的是,这个程序编译和运行都很完美。现在我使用的是XCode Developer Tools附带的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;

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

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

程序编译并运行完美。。。这是故意的行为吗?

这是偶然行为。

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

最新更新