编译:为了将函数与变量变为二进制(.o文件)。
链接是为了将独立的函数链接起来形成一个整体,形参一个.o文件。
编译工作以文件为单位(编译时a.c不去管b.c,所以要进行声明);链接以工程为单位,将编译成此的单个.o文件整体链接为一个可执行文件。链接是将彼此的全局与函数相链接。
链接可分为外链接、内链接和无链接。
1.外链接:在整个程序范围内进行链接(可跨文件)。例如:全局变量与一般函数具有唯一性。
2.内链接:c文件内部链接每一个.c生成一个.o文件,在当前范围内链接(不跨文件)。例如:static修饰的函数/全局变量。
3.无链接:代表这个符号本身不参与链接。例如:所有的局部变量,包括(static局部变量和auto)。
全局变量与函数不可出现同名的根本性原因在于外部链接,外部链接的性质决定了其唯一性。
所以在高级语言中,有了namespace。——加前缀。
在C语言中,可以将明显不会在别的文件中使用的全局变量用static修饰,变为内链接的全局变量,一定程度上解决了这个问题,但不太灵活。
所以也就决定了C语言写大程序很可能。
static的两种用法:
1.改存储类型-针对局部变量(数据段、bss段)。
2.改链接属性-针对全局变量(内链接)。
所以在明显不会在其文件使用的全局变量,尽量使用static进行声明。
使用extern明确声变量为明外链接。
全局变量不能放在.h中,不然会出现重复定义,也不能在其中进行函数定义,理由就是在两个文件中进行同一全局类型数据初始化时,会出现err。
存储类决定了生命周期;作用域决定了链接属性。
宏与inline函数为无链接类型,inline在编译时是直接展开的,不用链接,宏也是直接展开(预处理时进行)。