源程序会经过预处理,编译,汇编,链接多个步骤才能在机器上生成可执行程序。
1.预处理
2.编译
3.汇编
4.链接
链接会将所有用到的目标程序链接程序链接起来,无论是动态链接还是静态链接,最终都会生成一个可以在计算机上直接运行的可执行程序。
例子:
1.预处理
预处理器在程序编译之前,会先进行预处理工作,在C程序中,#开头的代码都属于预处理范围。
1)#include : 将头文件包含到当前源文件中
2)#define : 将宏定义展开
3)#ifdef : 按照条件处理编译内容
4)#other : 处理其他宏指令
预处理除了处理#开头的代码,还处理
1)处理预定义的宏:如_FILE_
2) 用一个空格代替连续的注释
3)处理三元符: 例如将??= 替换成 #, ??/ 替换成 \
2.编译
编译器会对预处理的代码进行词法分析,语法分析,语义分析,将符合规定的代码转换成等价的汇编代码。
3.汇编
汇编器将编译器生成的汇编代码生成计算机可以直接识别的机器指令,并生成目标文件。
4.链接
链接会将所有用到的目标程序链接程序链接起来,无论是动态链接还是静态链接,最终都会生成一个可以在计算机上直接运行的可执行程序。
例子:
1.#include<> 和 #include ""的区别:#include<>直接从编译器指定的库文件中去查找,而#include "" 会先中源文件所在目录中查找(或者当“”中指定的路径),如果找不到,则会再次从编译器指定的路径中去查找。
2.#define 宏定义的过程当中如 :
#define HEIHEI(x,y,z) (x##y#z)
## 会将其前后的参数转换成字符串,#会将其后的参数字符串化,因此HEIHEI(H,1,2) 后连接的结果是"H12"
3. assert 宏: 包含有assert.h 中,
A. assert 最好检测一个条件,以便准确定位错误信息内容
B. assert 中不要修改变量的值,因为如果assert 在正式RELEASE 之后被屏蔽了,那么里面的变量也会将被屏蔽,此时如果在内部对变量有操作,那可能会影响程序正常运行。