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