六、C语言宏定义与预处理、函数和函数库
6.1.1 由源码到可执行程序的过程
(1)源码.c—>(预处理)—>预处理过的.i源文件—>(编译)—>汇编文件.s—>(汇编)—>目标文件.o—>(链接)—>elf可执行程序
(2)预处理用的是预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上其它一些额外的会用到的可用工具,合起来叫编译工具链。GCC就是一个编译工具链。
6.1.2 预处理的意义
(1)编译器本身的主要目的是编译源代码,将C的源代码转化成.s的汇编代码。编译器聚焦核心功能后,就剥离出了一些非核心的功能到预处理器去了。
(2)预处理器帮编译器做一些编译前的杂事。
6.1.3 编程中常见的预处理
(1)#include (#include <>和#include “”的区别)
(2)注释
(3)#if #elif #endif #ifdef
(4)宏定义
6.1.4 gcc中只预处理不编译的方法
(1)gcc编译时可以给一些参数来做一些设置,譬如gcc xx.c -o xx可以指定可执行程序的名称;譬如gcc xx.c -c -o xx.o可以指定只编译不连接,也可以生成.o的目标文件。
(2)gcc -E xx.c -o xx.i可以实现只预处理不编译。一般情况下没必要只预处理不编译,但有时候这种技巧可以用来帮助我们研究预处理过程,帮助debug程序。
总结:宏定义被预处理时的现象有:第一,宏定义语句本身不见了(可见编译器根本就不认识#define,编译器根本不知道还有个宏定义);第二,typedef重命名的语句还在,说明它和宏定义有本质区别的,说明typedef是由编译器来处理而不是预处理来处理的。