我已经用C++工作了好几周了,但是头文件(或者我认为的链接器)背后的机制让我感到困惑.我已经习惯于创建一个"main.h"来分组我的其他头文件并保持main.cpp整洁,但有时这些头文件抱怨无法找到不同的头文件(即使它已声明在"main.h"中.我可能没有很好地解释它,所以这是我正在尝试做的简略版本:
//main.cpp
#include "main.h"
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
-
//main.h
#include "player.h"
#include "health.h"
#include "custvector.h"
Run Code Online (Sandbox Code Playgroud)
-
//player.h
#include "main.h"
class Player {
private:
Vector playerPos;
public:
Health playerHealth;
};
Run Code Online (Sandbox Code Playgroud)
-
//custvector.h
struct Vector {
int X;
int Y;
int Z;
};
Run Code Online (Sandbox Code Playgroud)
-
//health.h
class Health {
private:
int curHealth;
int maxHealth;
public:
int getHealth() const;
void setHealth(int inH);
void modHealth(int inHM);
};
Run Code Online (Sandbox Code Playgroud)
我不会包括health.cpp,因为它有点冗长(但确实有效),它确实有#include "health.h"
.
无论如何,编译器(Code :: Blocks)抱怨"player.h"找不到类型'Health'或'Vector'.我认为,如果我使用#include "main.h"
"player.h",它将能够找到定义Health
并Vector
感觉它们包含在"main.h"中.我想他们会按照自己的方式进行隧道(player.h - > main.h - > health.h).但这并没有奏效.是否有某种图表或视频可以澄清应该如何设置?谷歌帮助不大(也不是我的书).
Uri*_*Uri 10
考虑头文件的最佳方式是"自动复制和粘贴".
考虑它的一个好方法(虽然不是如何实际实现)是在编译C文件或C++文件时,预处理器首先运行.每次遇到#include语句时,它实际上都会粘贴该文件的内容而不是#include语句.这样做直到没有更多包含.最终缓冲区传递给编译器.
这引入了几个复杂性:
首先,如果AH包括BH而BH包括Ah,那么你就遇到了问题.因为每次你想要粘贴A,你需要B,它内部会有A!这是递归.因此,头文件使用#ifndef,以确保不会多次读取相同的部分.这可能发生在您的代码中.
其次,在所有头文件被"展平"之后,你的C编译器会读取文件,所以你需要考虑在推理什么之前声明什么.
这里的其他答案有效地解释了头文件和预处理器的工作方式.你遇到的最大问题是循环依赖,从经验来看,我知道这可能是一种巨大的痛苦.此外,当开始发生时,编译器开始以非常奇怪的方式运行并抛出非常有用的错误消息.我在大学里由C++大师教授的方法是用每个文件(例如一个头文件)来启动
//very beginning of the file
#ifndef HEADER_FILE_H //use a name that is unique though!!
#define HEADER_FILE_H
...
//code goes here
...
#endif
//very end of the file
Run Code Online (Sandbox Code Playgroud)
这使用预处理程序指令自动防止循环依赖.基本上,我总是使用文件名的全大写版本.custom-vector.h
变
#ifndef CUSTOM_VECTOR_H
#define CUSTOM_VECTOR_H
Run Code Online (Sandbox Code Playgroud)
这允许您在不创建循环依赖项的情况下包含文件willie-nillie,因为如果多次包含文件,则其预处理器变量已经定义,因此预处理器会跳过该文件.它还使以后更容易使用代码,因为您不必筛选旧的头文件以确保您还没有包含某些内容.我会再说一遍,确保你在你的#define
陈述中使用的变量名对你来说是独一无二的,否则你可能会遇到没有正确包含某些东西的问题;-).
祝好运!