我们来看两个例子
1、用typedef定义类型
typedef unsigned int U32
..........
U32 var=3;
2、用define定义类型
#define U32 unsigned int
........
U32 var=3
同样是定义成无符号整形,但是两种定义方法是有区别的。区别在于:typedef定义的类型是在 编译阶段处理的,而#define是在 预处理阶段处理的。
对于编译流程主要有四个阶段:预处理阶段,编译阶段,汇编阶段,链接阶段。
预处理阶段:
预处理器(cpp)根据以字符#开头的命令(directives),修改原始的C程序。如hello.c中#include <stdio.h>指令告诉预处理器读系统头文件stdio.h的内容,并把它直接插入到程序文本中去。结果就得到另外一个C程序,通常是以.i作为文件扩展名的。
编译阶段:
在这个阶段中,首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,把代码翻译成汇编语言,生成汇编代码,以.s为后缀的文件。
汇编阶段:
这个阶段中是把编译阶段生成的”.s”文件转成目标文件.o文件。
链接阶段:
在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”。