即使我不包含必要的 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文件包含了。
关于这个的一些怪癖:
如果您在另一个前面没有 GLM 头文件的 .cpp 文件中执行 #include "Header.h"
,则它不会编译。
如果您使用 Header.h 文件并将其重命名为 .cpp 文件,它将无法工作,因为编译器将尝试将其编译为自己的单元(这将失败,因为 GLM 文件不存在)。
所以我正在做一些基本的 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文件包含了。
关于这个的一些怪癖:
如果您在另一个前面没有 GLM 头文件的 .cpp 文件中执行
#include "Header.h"
,则它不会编译。如果您使用 Header.h 文件并将其重命名为 .cpp 文件,它将无法工作,因为编译器将尝试将其编译为自己的单元(这将失败,因为 GLM 文件不存在)。