2.2 分段编译工具
当创建大的项目时,分段编译尤其重要。在C/C++(www.cppentry.com)中,可以将一个大程序构造成为许多小程序块,而这些小程序块容易管理,可独立测试。程序分割的最基本的方法是创建命名子程序。在C和C++(www.cppentry.com)里,子程序称为函数(function),函数是一段代码段,可以将这些函数放在不同的文件中,并能分别编译。另一种解释,函数是程序的基本单位,因为不能把一个函数分开,让其不同的部分放在不同的文件中;整个函数必须完整地放在一个文件里(尽管文件可拥有不止一个函数)。
当调用函数时,通常要传给它一些参数(argument)。这些参数是我们希望函数在执行时使用的值。当函数执行完后,可得到一个返回值(return value),返回值是函数作为执行结果返回的一个值。但也可以编写不带参数没有返回值的函数。
程序可由多个文件构成,一个文件中的函数很可能要访问另一些文件中的函数和数据。编译一个文件时,C或C++(www.cppentry.com)编译器必须知道在另一些文件中的函数和数据,特别是它的名字和基本用法。编译器就是要确保函数和数据被正确地使用。“告知编译器”外部函数和数据的名称及它们的模样,这一过程就是声明(declaration)。一旦声明了一个函数或变量,编译器知道怎样检查对它们的引用,以确保引用正确。
2.2.1 声明与定义
声明(declaration)和定义(definition)这两个术语在整本书中都会准确地区分使用,因此必须弄清它们之间的区别。事实上,所有的C/C++(www.cppentry.com)程序都要求声明。编写第一个程序之前,需要了解声明的基本方法。
声明是向编译器介绍名字—标识符。它告诉编译器“这个函数或这个变量在某处可找到,它的模样像什么”。而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存变量的数据。对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。
在C和C++(www.cppentry.com)中,可以在不同的地方声明相同的变量和函数,但只能有一个定义[有时这称为ODR(one-definition rule, 单一定义规则)]。当连接器连接所有的目标模块时,如果发现一个函数或变量有多个定义,连接器将报告出错。
定义也可以是声明。如果定义int x;之前,编译器没有发现标识符x,编译器则把这一标识符看成是声明并立即为它分配存储空间。