什么时候在程序中包含<string>标头?

时间:2019-03-01 00:44:19

标签: c++ syntax

当诸如“ iostream”之类的库已经提供解决方案时,您是否包括“ string”标头?

示例:如果已经包含iostream库,是否包括字符串库?哪个是正确的专业方法?

#include <iostream>
#include <fstream>

using namespace std;
int main() {
    ifstream fin;
    fin.open("input.txt");
    string data;
    fin >> data;
    cout << data << endl; // Works with <iostream>, and without <string>
    fin.close();
    return 0;
}

示例2:即使程序编译时没有字符串,也可以使用字符串库来提供其他功能吗?

#include <iostream>
#include <string>
#include <fstream>

using namespace std;
int main() {
    ifstream fin;
    fin.open("input.txt");
    string data;
    fin >> data;       
    cout << data << endl; // Even though <iostream> allowed program to compile, we include the <string> library.
    fin.close();
    return 0;
}

收到的消息指出了我的CSC 101类编程任务,因为即使程序可行,老师说在使用字符串数据类型时我也需要包括字符串库。即使从技术上讲,没有它也很好。 那是问题。

1 个答案:

答案 0 :(得分:4)

您的老师是对的。

您的程序在没有<string>偶然的情况下运作了。。在那种情况下,那天那天,您在那个平台上的那个版本的标准库实现,通过<iostream>可传递地包含了您所需要的。标准库就像您的代码一样,只是代码,而且恰好在您的特定实现在<iostream>内包含#include <string>的情况下发生。它可能被埋在许多其他#include之后,但最终到达了那里。但这确实是一次纯粹的机会,并不意味着这是语言所保证的,甚至在实践中也必须始终如此。

您应该始终按照标准进行编码。

如果您使用的是features from <string>,请添加<string>

就在今天,我试图用一个新的工具链构建我的大项目,并发现了一些我偶然依赖传递包含的地方,由于新的标准库实现略有不同,结果破坏了构建标头的排列。我尽职尽责地添加了丢失的#include,现在世界变得更美好了。