0

这是相关文件中的一些代码,称为 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 指令包含了其他文件的代码,则头文件只会从其他文件中重新转换代码,所以我不确定这是怎么发生的,并且很想知道发生了什么。

4

1 回答 1

1

不,只是包含此Global.h头文件的任何内容都必须已经#include包含所有必需的头文件。

有点简单:#include通过逻辑插入#included 文件的内容代替#include语句本身来替换语句。编译翻译单元时,所有#include语句都以这种方式处理。好像所有#include语句都被引用文件的内容逻辑替换。最终结果是一个逻辑源文件,一个翻译单元,从头到尾编译。

所以,如果在所有#include语句都以这种方式处理之后,只要必要的头文件,和其他,在从这个头文件引用<iostream>的类和其他资源之前,逻辑地插入到逻辑翻译单元中,这个翻译<iostream>单元将毫无问题地编译。是否是#include所需头文件的同一个头文件<iostream>等;#include或其他一些较早获取d#include的头文件,即这些头文件;没关系。

确实,良好实践表明每个文件都应明确#include其先决条件。但如果没有,只要其他一些头文件已经被#included,翻译单元仍然会编译。

于 2016-10-16T22:22:57.170 回答