程序员技术栈程序员C++

C++ 写个游戏引擎—(基础篇) 2

2018-12-02  本文已影响154人  zidea

目标:了解 c++ 编译过程

基本要求:有一定编程基础,对游戏编程有热情

开发平台:windows

开发工具:visual studio 2017 communicty

调试 c++ ,我们去掉get()后的;号,然后 ctrl+f7 对main.cpp 进行编译。

如果程序编译或build时报错,我们尽量不要看这里提示,这里提示信息不准确。

我们需要看输出中的错误信息,C2143 中  C表示编译错误。还有这里我用的是中文版 visual studio ,大家还尽量用英文版 vs。

我们将 Log.cpp 中函数 Log 的函数名修改为 Logr,然后编译Log.cp 文件

然后我们尝试编译(调用 Log.cpp 中 Log 方法的) Main.cpp

发现编译并没有报错,这是因为在编译时,只要声明 Log 函数,编译器就相信您的声明认为函数已经存在,编译器并不关心Log 函数实际上是否存在。

但如果尝试 build 项目,结果就会发现这时 build(生成) 失败了,这是因为链接时,无法找到声明函数的函数体,所有提示我们 main.cpp 引用的符号(symbol) 还没有定义。 

先说一下编译,在编译前先需要进行预处理,然后将 cpp 文件编译为 obj 文件这就就是大概编译的过程。预处理会执行那些预处理语句。预处理后的文件格式就符合编译器的要求(也就是创建了 AST),这时候编译器就可以对 cpp 文件进行编译了。编译后的代码就是 CPU 可以执行的一些静态数据或指令(机器码)。在 cpp 中文件作用与 java 中的文件含义不同,在 java 中文件名需要和类型一致,并且包名需要文件夹结构一致,java 需要通过这些信息读取文件确定文件存在,在 cpp 中文件只是负责为编译器提供代码,所有文件名和文件夹结构不需要与代码有任何关联。编译器只是对文件扩展名感兴趣,对不同的扩展名(如 c .cpp .h) 按不同类型文件进行处理而已。

我们看cpp编译后 obj 文件大小,这些文件都很大,是因包含了 iostream 

我们来创建一个 cpp 文件,命名为 Math.cpp

然后输入以下代码

ctrl+f7编译 Math.cpp ,然后 debug 文件夹就会发现这里多了一个编译好的 obj 文件。

有许多预处理符号,我们今天就介绍 #include 其他的随后会分享给大家。

#include 用法很简单,就是打开要包含的文件,然后将文件内容复制其所在的位置。

首先我们在头文件夹中创建一个 EndBrace.h

在这个文件中仅输入 } (结束花括号)

回到 Math.cpp 文件中,将 } 替换为 #include "EndBrace.h"

然后编译 Math.cpp 编译成功。

我们看一看预处理的过程,打开属性对话框,然后进行下图中操作,将预处理文件从”否“修改为”是“,这样我们就看到预处理的过程。

再次编译 Math.cpp 文件,发现在 debug 目录下多出一个 Math.i 文件。

这里我用 visual studio code 打开 Math.i 文件。看图我们发现实际上就是将包含预处理语句(#include) 替换为 EndBrace 中的内容。

然后使用 #define 将 INTEGER 定义为 int, 预处理时会根据 #define 定义内容进行替换。这里将 INTEGER 全部替换为 int

打开 Math.i 文件看效果

我们也可以通过 #if 语句控制其包含的代码块是否显示( 0 不显示 1 为显示),预处理会根据 #if 来控制代码是否参与 build

上一篇下一篇

猜你喜欢

热点阅读