即使我不包含必要的 headers,程序也会编译?

Program compiling even though I don't include necessary headers?

所以我正在做一些基本的 OpenGL 工作,对于我的数学函数,如向量、矩阵,我使用 GLM 库。我创建了一个 header 文件,它应该与所述库一起工作,我注意到它编译并按预期工作,甚至没有包括 GLM-library.[=13= 所需的 header 文件]

我的简化示例程序:

Main.cpp

#include <glm.hpp>
#include <gtc/matrix_transform.hpp>
#include <gtc/type_ptr.hpp>
#include "Header.h"

int main(int argc, char* args[]){
    Header::test();
    return 0;
}

Header.h

#pragma once
#include <iostream>

namespace Header {
    void test() {
        glm::vec3 vec = glm::vec3(1.0f, 5.0f, 1.0f);
        std::cout << vec.x << std::endl;
        std::cout << vec.y << std::endl;
    }
};

我的输出:

1

5

我怎么可能不需要在我的 "Header.h" 文件中包含 GLM-headers?

.h 文件未编译。由于您首先包含 glm headers,因此当 header.h 文件包含到 cpp 中时,glm 已经包含在内。如果您尝试将 header 包含在没有 #include <glm.hpp> 的单独 cpp 中,它将失败。

您已经包含了 GLM header,然后再包含 Header.h。

编译单元就是你的Main.cpp文件; header 文件没有单独编译。

C-Preprocessor cpp 在尝试编译之前处理所有 # 语句。尝试 运行 cpp Main.cpp:这将向您显示 g++ 将实际编译的源文件。

对于C++程序,编译器只将.cpp文件作为一个单元进行编译。头文件 "included" 到 .cpp 文件中。

所以编译器编译 Main.cpp 并且当编译器看到 #include "Header.h" 时,它会用该文件的内容替换 #include 行。

由于其工作原理,头文件不需要包含所需的所有内容。这是因为它在你的头文件之前被cpp文件包含了。

关于这个的一些怪癖:

  1. 如果您在另一个前面没有 GLM 头文件的 .cpp 文件中执行 #include "Header.h",则它不会编译。

  2. 如果您使用 Header.h 文件并将其重命名为 .cpp 文件,它将无法工作,因为编译器将尝试将其编译为自己的单元(这将失败,因为 GLM 文件不存在)。