我对此感到困惑了一段时间。为了测试这一点,我制作了一个简单的程序,只需创建一个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>
。由于无法保证这一点,因此依赖这种传递性包容是错误的。