将源代码.c翻译为可执行的机器指令.exe,分为一下两部分:
1)编译:每个.c文件经过编译器处理变为目标文件.obj
2)链接:链接器将项目下的所有目标文件和链接库链接生成可执行程序.exe
1)预处理:完成文本操作,包括头文件的包含,#define定义的替换,删除注释等。
2)编译:将c代码转换为汇编代码,在语法语义词法的分析上。(完成符号汇总)
3)汇编:把汇编代码转换为目标文件,即二进制指令。(根据编译的符号汇总生成符号表)
符号汇总:将全局变量符号汇总,引入的外部符号不知地址位置。
符号表:收集符号汇总,将符号与其相应地址一一对应。
将所有文件的符号表合并,重复的重新定位添加正确地址。
1)定义标识符:#define + name + 你想替换的东西
2)定义宏:带有参数的定义,类似函数,#define name(参数) stuff(要使用括号让计算逻辑严谨)
3)#undef:取消你之前的定义。
#define Add(X) printf("an" #X "is good");
因为#X将X变为对应的字符串形式,即有双引号,”X",这样printf可以识别做到文本的连续。
Add(a):生成 an a is good。
类似a++这种,因为#define是存粹的 替换,每次X替换为a++后就需要改变一次a的值,会让a的值变得不可控。
这里就说些主要的:
宏:无类型,在翻译环境下的预处理阶段从而不能调试,优先级容易出问题;宏可用类型作参数。
本地文件用:#include “local.h" //先查找本地项目文件下,没找到local.h再去库函数里找
库文件用:#include <stdio.h> //就在库函数里找
防止头文件多次被包含:#pragma one//头文件只能包含一次。