第4章 连接
●什么是连接器
C语言中的一个重要思想就是分别编译,即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合在一起。
典型的连接器把由编译器或汇编器生成的若干个目标模块,整合成一个被称为载入模块或可执行文件的实体,该实体能够被操作系统直接执行。
连接器的输入是一组目标模块和库文件,连接器的输出是一个载入模块。连接器读入目标模块和库文件,同时生成载入模块。对每个目标模块中的每个外部对象,连接器都要检查载入模块,看是否已有同名的外部对象。如果没有,连接器就将该外部对象添加到载入模块中;如果有,连接器就要开始处理命名冲突。
连接器对C语言“知之甚少”,所以有很多错误不能被检测出来。
●声明与定义
每个外部对象都必须在程序某个地方进行定义。每个外部变量只能够定义一次。
●命名冲突与static修饰符
两个具有相同名称的外部对象实际上代表的是同一对象,即使编程者的本意并非如此,但系统却会如此处理。
static修饰符是一个能够减少命名冲突的有用工具。
如果若干个函数需要共享一组外部对象,可以将这些函数放到一个源文件中,把它们需要用到的对象也都在同一源文件中以static修饰符声明。
static修饰符不仅适用于变量,也适用于函数。
●形参、实参与返回值
任何C函数都有一个形参列表,列表中的每个参数都是一个变量,该变量在函数调用过程中被初始化。
函数调用时,调用方将实参列表传递给被调用函数。
任何一个C函数都有返回类型,要么是void,要么是函数生成结果的类型。
如果任何一个函数在调用它的每个文件中,都在第一次被调用之前进行了声明或定义,那么就不会有任何与返回类型相关的麻烦。
●检查外部类型
保证一个特定名称的所有外部定义在每个目标模块都有相同的类型,一般来说是程序员的责任。而且,“相同的类型”应该是严格意义上的相同。
●头文件
每个外部对象只在一个地方声明,这个声明的地方一般就在一个头文件中,需要用到该外部对象的所有模块都应该包括这个头文件。特别需要指出的是,定义该外部对象的模块也应该包括这个头文件。
用户320184 2010-12-28 12:09
tengjingshu_112148725 2009-4-10 21:38