【问题标题】:No header files included in file but can still use classes/functions from unincluded header files文件中不包含头文件,但仍可以使用未包含的头文件中的类/函数
【发布时间】:2017-02-25 19:52:24
【问题描述】:

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

【问题讨论】:

  • 您的意思是您使用g++ -c Global.h 编译它并且它可以工作?
  • @Jean-Francois Fabre 它在visual studio中工作,不确定gcc编译器会做什么

标签: c++ include translation-unit


【解决方案1】:

没有。只是包含这个Global.h 头文件的任何东西都必须已经#includeing 所有必需的头文件。

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

所以,如果毕竟#include语句都以这种方式处理,只要必要的头文件,&lt;iostream&gt;等,在逻辑翻译单元之前被逻辑插入到来自@的类和其他资源从这个头文件引用的 987654330@,这个翻译单元将毫无问题地编译。是否为#includes所需的头文件,&lt;iostream&gt;等同一个头文件;或其他一些更早获得#included 的头文件,其中#includes 这些头文件;没关系。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 2020-02-14
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多