尽管注释掉了所需的头文件,为啥这个 C++ 程序仍能编译和运行? [复制]
Posted
技术标签:
【中文标题】尽管注释掉了所需的头文件,为啥这个 C++ 程序仍能编译和运行? [复制]【英文标题】:Why does this C++ program compile and run despite required header files being commented out? [duplicate]尽管注释掉了所需的头文件,为什么这个 C++ 程序仍能编译和运行? [复制] 【发布时间】:2018-07-19 17:43:27 【问题描述】:我正在浏览一组 C++ 教程,并且正在使用其中一个示例的标题包含。为什么即使 algorithm
和 vector
被注释掉,以下代码仍然会运行?
//#include <algorithm>
#include <iostream>
#include <random>
//#include <vector>
using namespace std;
int main()
vector<int>::const_iterator iter;
cout << "Creating a list of scores.";
vector<int> scores;
scores.emplace_back(1500);
scores.emplace_back(3500);
scores.emplace_back(7500);
cout << "\nHigh Scores:\n";
for (iter = scores.begin(); iter!=scores.end(); iter++)
cout << *iter << endl;
cout << "\nFinding a score.";
int score;
cout << "\nEnter a score to find: ";
cin >> score;
iter = find(scores.begin(), scores.end(), score);
if (iter!=scores.end())
cout << "Score found.\n";
else
cout << "Score not found.\n";
cout << "\nRandomising scores.";
random_device rd;
default_random_engine generator(rd());
shuffle(scores.begin(), scores.end(), generator);
cout << "\nHigh Scores:\n";
for (iter = scores.begin(); iter!=scores.end(); iter++)
cout << *iter << endl;
cout << "\nSorting scores.";
sort(scores.begin(), scores.end());
cout << "\nHigh Scores:\n";
for (iter = scores.begin(); iter!=scores.end(); iter++)
cout << *iter << endl;
return 0;
【问题讨论】:
唯一可行的方法是,如果注释掉的标头是从项目的其他地方隐式包含的。如果找不到std::vector
和std::find()
的定义,编译器会失败,所以<vector>
和<algorithm>
仍然是必需的,不管你自己是否包含它们。
标准标头可以包含任何其他标准标头,但您不能指望它。另一种看待它的方式是你需要包含必要的头文件,但如果你不这样做,编译器不需要失败。
这对我的理解很有帮助。来自强制声明所需依赖项的语言,我惊讶地发现我仍然可以编译上述内容。
【参考方案1】:
在 C++(与 C 不同)中,包含任何一个标准头文件都可以等同于包含任何或所有其他标准头文件。所以,如果你包含<iostream>
,那可以相当于还包含<algorithm>
、<vector>
、<string>
等。
早期,许多编译器/库都充分利用了这一点。最近,它们倾向于更接近标头仅声明/定义它的要求,但仍有一些标头至少间接包含其他一些标头。
【讨论】:
以上是关于尽管注释掉了所需的头文件,为啥这个 C++ 程序仍能编译和运行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
创建自定义 psobject 时出现 op_Subtraction 错误,尽管检索到了所需的结果
我得到了所需的输出,但它仍然抛出一个错误,说“未找到用于打印的 glyphicon”,尽管打印 glyphicon 在输出中可见