第四章 链接器

C语言中,一个重要的思想为分别编译:即若干个源程序在不同时刻单独进行编译,然后在恰当的时候整合在一起

链接器无法读懂C语言,那么如何对源程序进行链接呢?

链接器虽然无法理解C语言,但是却能理解机器语言和内存布局。编译器的任务是把源程序翻译成与链接器有意义的形式,这样链接器就能读懂C语言了

典型的链接器把由编译器或汇编器生成的若干个目标模块整合成一个被称为可执行文件的实体(.exe),该实体可由计算机系统直接操作

声明与定义

int a;

如果其出现在所有函数之外,就说明a是一个外部整型变量,同时为a分配空间。因为外部对象a没有被指定初始值,因此它的初始值被默认为0。

extern int a;

这个声明语句并不是对a的定义。这个语句仍然说明a是一个外部整型变量,但是因为它包含了extern关键字,这就显示地说明了a的存储空间是在程序的其他地方分配的。

这份声明是对一个外部变量的显示引用,而不是对a的定义

因此,在程序的别的某个地方就需要包含语句:

int a;

这两个语句可以在一个源文件中,也可以不在一个源文件中

如果一个变量在不同的源文件中重复定义,系统会如何处理?

例如在一个源文件中出现:

int a = 9;