本章讨论一个程序包含多个函数时所产生的问题;局部变量和外部变量的差异、含有声明的复合语句的程序块问题,以及局部名,外部名和在程序块中声明的名字的作用域规则问题。
10.1 局部变量
在函数体内声明的变量称为该函数的局部变量。
默认情况下,局部变量具有下面性质:
1,自动存储期限。局部变量的存储单元是在包含此变量的函数被调用时“自动”分配的,函数返回时收回分配。该函数返回后,局部变量的值无法保留。
2,块作用域。变量的作用域是可以引用该变量的程序文本部分。局部变量拥有块作用域,从变量声明的点开始一直到所在函数体的末尾。局部变量的作用域不能延伸到函数体外,所以其他函数可以用同名变量。
10.1.1 静态局部变量
在局部变量声明中放置存储类型 static说明,可以使变量具有静态存储期限而不再是自动存储期限。拥有静态存储期限的变量拥有永久的存储单元,在整个程序执行期间都会保留变量的值。
10.1.2 形式参数
形式参数拥有和局部变量一样的性质,即自动存储期限和块作用域。
10.2 外部变量
传递参数是给函数传送信息的一种方法,函数还可以通过外部变量进行通信。外部变量是声明在任何函数外的。
外部变量(有时称为全局变量)的性质不同于局部变量的性质:
1,静态存储期限(其值一直保存)
2,文件作用域,外部变量拥有拥有文件作用域,跟随在变量声明后的所有函数都可以使用它。
10.2.1 外部变量的利与弊
*在程序维护期间,如果改变外部变量,则需要检查同一文件中所有的用到此变量的函数是否仍能正常工作;
*如果外部变量赋予了错误的值,可能很难确定出错的函数;
*很难在其他程序中复用依赖于外部变量的函数,依赖外部变量的函数不是“独立的”
10.3 程序块
C语言允许包含声明的复合语句,包含多声明和多语句;默认情况下,程序块中的变量的存储期限是自动的,作用域也是在块内。
10.4 作用域
在C程序中,相同的标识符可以有不同的含义,其作用域规则使得程序员和编译器可以确定与程序中给定点相关的是哪种含义。
10.5 构建C程序
目前只考虑单文件的程序的情况下,以上是主要的元素,C语言虽没有对以下的项有严格说顺序要求,但是书里强烈建议在第一次调用函数前要对每个函数进行定义或声明;以下是一种可能的编排顺序:
- 诸如#include和#define的预处理指令
- 类型定义
- 外部变量的声明
- 除main函数之外的函数的原形
- main函数的定义
- 其他函数的定义