c++只是一个文本可以理解为txt,编译器将文本转换为实际应用程序的方法
从文本变为二进制文件分为两步:编译、链接
如果学过java可以更好理解这个区别:在java中创建一个类,需要类名文件名一致,并且package路径要对;而c++不是,他只是一个文件,只需要告诉编译器这个文件是什么类型即可,是后缀cpp的或者txt的或者自定义的,然后告诉编译器这一类文件应该怎么处理就可以了
编译将所有的文本文件转换为目标文件的一种中间格式(obj)
生成obj文件做的几件事:
1.预处理代码,所有预处理语句都会先处理
会识别#后的预处理语句,
#include 会把包含的文件内容复制到标记的位置(就是直接复制文本)
#define 会把文件中所有和define名字一样的进行文本替换
#if 和#endif 会根据if后的条件进行判断是否预编译这两个标记之间的代码、
做个实验:
EndBrace.h文件:是的,只有一个花括号
}
math.cpp文件
#if 1
#define INTEGER heihei
INTEGER Multiply(int a,int b) {
INTEGER result = a * b;
return result;
#include "EndBrace.h"
#endif
接下来要改一个配置:为了一会能看到预处理后的代码
上面的准备工作做完以后就可以切换到math.cpp文件然后进行编译(Ctrl+F7)然后会生成一个math.i的文件;也可以注意到如果对整个项目进行编译的话,每个cpp文件都会生成一个对应的 obj文件。
我们打开这个文件
可以看到
1. #define INTEGER heihei 语句将所有INTEGER替换成了heihei(你想写啥都行,只是测试预编译用)
2.然后#include "EndBrace.h"把文件中的花括号复制了进来
3.如果#if后面是0 ,那么这段代码就不会被预编译了
上面预编译就结束了,记得把配置改回去,因为预处理到文件如果是yes,那么就不会生成obj文件
还有定义的全局变量改成能识别的 int,总之上面测试的代码只能通过预编译,因为heihei这个东西所以无法运行,可以改成int。
有没有发现main.obj很大几十kb,那是因为把iostream复制进去了
编译阶段首先还需要改下配置,因为obj是机器码,看不懂,我们需要看编译后的文件,所以改成下面配置,虽然我还是看不懂但至少有英文单词了
接下来一样滴Ctrl+F7 然后打开math.asm 文件,这个就是汇编语言啦,不研究了~电脑可以执行了
这个配置是一个优化配置两张图都要配置好不然会报错,选择最大速度,在次编译后你会发现文件内容会少很多,比如写了没用的代码也会被优化掉
不晓得为啥,日后更新



