程序编译,即使我没有包含必要的标题?

时间:2015-10-31 21:45:01

标签: c++ glm-math

所以我正在做一些基本的OpenGL内容,对于我的数学函数,如向量,矩阵,我使用GLM库。我创建了一个头文件,它应该与所述库一起工作,我注意到它编译并按预期工作,甚至不包括GLM库所需的头文件。

我的简化示例程序:

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标题?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

在包含Header.h之前,您已经包含了GLM标题。

编译单元是您的Main.cpp文件;头文件不是单独编译的。

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

答案 2 :(得分:2)

对于C ++程序,编译器仅将.cpp文件编译为一个单元。头文件是&#34;包含&#34;进入.cpp文件。

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

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

有些关于此的怪癖:

  1. 如果您在另一个没有GLM头文件的.cpp文件中执行#include "Header.h",那么它将无法编译。

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