文件中不包含头文件,但仍可使用未包含的头文件中的类/函数

时间:2016-10-16 22:16:02

标签: c++ include translation-unit

这里有一些来自相关文件的代码,名为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继续。

1 个答案:

答案 0 :(得分:1)

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

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

因此,如果以这种方式处理所有#include语句之后,只要必要的头文件<iostream>和其他语句在逻辑转换单元中被逻辑地插入到类之前,来自此<iostream>的其他资源从此头文件引用,此转换单元将编译没有问题。它是否与#include所需的头文件<iostream>和其他头文件相同的头文件;或者其他一些早先获得#include d的头文件,#include这些头文件;没关系。

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