所以我正在做一些基本的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标题?
答案 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文件中。
有些关于此的怪癖:
如果您在另一个没有GLM头文件的.cpp文件中执行#include "Header.h"
,那么它将无法编译。
如果您使用Header.h文件并将其重命名为.cpp文件,它将无法正常工作,因为编译器将尝试将其编译为自己的单元(这将是失败,因为GLM文件不存在。)