美文网首页程序员技术栈程序员C++
C++ 写个游戏引擎—(基础篇) 2

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

作者: zidea | 来源:发表于2018-12-02 20:20 被阅读154次

    目标:了解 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

    相关文章

      网友评论

        本文标题:C++ 写个游戏引擎—(基础篇) 2

        本文链接:https://www.haomeiwen.com/subject/czdscqtx.html