这里有一些来自相关文件的代码,名为Global.h,它在其他头文件中使用,似乎编译得很好:
#pragma once
enum SType {null, lab, assignment, testPrep};
enum Code {none, 123, 222, 333, 432};
template<typename D>
bool validate(D task = string, D date = string) {
bool result = true;
if (task.size() < 3) {
cout << "Task too simple, please elaborate." << endl;
result = false;
}
else if (task.size() > 50) {
cout << "Task too detailed. Only 30 chars allowed." << endl;
task.empty();
result = false;
}
if (date == "02/20/93") {
date.empty();
date = "My birthday!";
}
return result;
}
正如您所看到的,我能够使用字符串和ostream对象而不声明使用命名空间或特定文件。显然这意味着Global.h正在从其他地方提取信息,但我很好奇这些信息来自何处?我一直认为头文件只会重新编译来自其他文件的代码,如果它们已经包含在文件本身的#include指令中,那么我不确定这是怎么回事,我很想知道是什么& #39; s继续。
答案 0 :(得分:1)
没有。只是包含此Global.h
标头文件的任何内容必须已经#include
所有必需的标头。
有点简单:通过逻辑插入#include
d文件的内容代替#include
语句本身来替换#include
语句。编译翻译单元时,将以这种方式处理所有#include
语句。好像所有#include
语句在逻辑上被引用文件的内容替换。最终结果是一个逻辑源文件,一个翻译单元,从头到尾编译。
因此,如果以这种方式处理所有#include
语句之后,只要必要的头文件<iostream>
和其他语句在逻辑转换单元中被逻辑地插入到类之前,来自此<iostream>
的其他资源从此头文件引用,此转换单元将编译没有问题。它是否与#include
所需的头文件<iostream>
和其他头文件相同的头文件;或者其他一些早先获得#include
d的头文件,#include
这些头文件;没关系。
确实,良好做法表明每个文件都应明确#include
其先决条件。但是如果它没有,只要其他一些头文件已经#include
d,翻译单元仍然会编译。