编译和链接
编译的过程
即.c文件转换成二进制可执行文件的过程。
C语言中,每个.c文件都视为一个“编译单元”。针对每个编译单元,编译器先把.c及所包含的.h文件转换成.o(.o是一个“目标文件”,也是一个二进制的文件了,但是还不能执行)。
链接过程就是把这些.o最后合并到一起。
为什么要进行合并?
实际开发中,经常会把一个函数的定义和调用分散在两个不同的.c中,就会被编译到不同的.o里面。如:a.o包含了test函数的定义,b.o包含了test函数的调用。
链接过程除了要链接用户自己写的文件编译的.o之外,还需要链接一些库文件(标准库,第三方库),此处的库可以是动态库(.dll)的方式提供,也可以是静态库(.a)的方式提供。
printf、strlen这些函数,使用的时候只是包含了.h文件
而头文件中只有声明,没有定义。函数定义也是通过链接过程来找到的。标准库函数的定义是包含在一个动态库中。
编译链接可分为四个过程:
1、预处理:宏替换,头文件展开,预编译指令的处理。正因为头文件展开,导致了待编译文件快速膨胀,后续的编译动作效率会受到很大影响。
2、编译:狭义的编译,特指把.c源代码变成汇编指令。具体涉及词法分析、语法分析、语义分析、中间代码生成、目标代码优化等编译原理相关知识。
3、汇编:把汇编指令变成二进制机器指令。
4、链接:把.o文件合并到一起。
预处理
预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
//以上两个打印日志时非常有用
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
//通过编译时间来区分程序的版本号
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
这些预定义符号都是语言内置的。 例如: