C++ 写个游戏引擎—(基础篇) 2
来源:zidea     阅读:630
牛牛兔源码
发布于 2018-12-02 23:16
查看主页

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

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 服务器应用
相关推荐
浅谈Nginx负载均衡与F5的区别
2020Java学习路线(珍藏版)
分享一位同学的阿里、百度前台面试经验
vue自己设置js图片碎片轮播图切换效果
MySQL进阶篇SQL优化(InnoDB锁问题排查与处理)
首页
搜索
订单
购物车
我的