阅读 ‧ 电子书库 总结:存储类
自动变量具有代码块作用域、空链接和自动存储时期。它们是局部的,为定义它们的代码块(通常是一个函数)所私有。寄存器变量与自动变量具有相同的属性,但编译器可能使用速度更快的内存或寄存器来存储它们。无法获取一个寄存器变量的地址。
具有静态存储时期的变量可能具有外部链接、内部链接或空链接。当变量在文件的所有函数之外声明时,它是一个具有文件作用域的外部变量,具有外部链接和静态存储时期。如果在这样的声明中再加上关键字static,将获得一个具有静态存储时期、文件作用域和内部链接的变量。如果在一个函数内使用关键字static声明变量,变量将具有静态存储时期、代码块作用域和空链接。
当程序执行到包含变量声明的代码块时,给具有自动存储时期的变量分配内存,并在代码块结束时释放这部分内存。如果没有初始化,这样的变量具有一个无效值。在程序编译时给具有静态存储时期的变量分配内存,并且在程序运行时一直保持。如果没有初始化,这样的变量被设置为0。具有代码块作用域的变量局部于包含变量声明的代码块。
具有文件作用域的变量对文件中在它的声明之后的所有函数可见。如果一个文件作用域变量具有外部链接,则它可被程序中的其他文件使用。如果一个文件作用域变量具有内部链接,它只能在声明它的文件中使用。

下面给出了一个使用全部5种存储类的小程序。它由两个文件(程序清单12.5和程序清单12.6)组成,因此您需要进行多文件编译(请参见第9章“函数”,或您的编译器指导手册)。程序的主要目的是使用全部5种存储类,并非提供一个设计范例;更好的设计将不需要文件作用域变量。

程序清单12.5 parta.c文件

阅读 ‧ 电子书库

程序清单12.6 partb.c文件

阅读 ‧ 电子书库

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

阅读 ‧ 电子书库

在该程序中,具有代码块作用域的静态变量subtotal保存运行时传递给函数accumulate()的数值的部分和具有文件作用域、内部链接的变量total保存运行时的总和。一旦有非正数传入,函数accumulate()就报告total和subtotal的值;并在报告时将subtotal重置为0。parta.c中的函数accumulate()函数原型是必须的,因为文件包含了一个accumulate()函数调用。对于partb.c来说,函数原型是可选的,因为这个函数虽然定义了,但是并没有在该文件中被调用。函数同时使用外部变量count来记录main()中的while循环执行了多少次(顺便提一下,这是一个什么情形下不应使用外部变量的反面例子,因为它使parta.c和partb.c的代码不必要地纠缠在一起)。在parta.c中,main()和report_ count()共享count。

下面是一个运行示例:

阅读 ‧ 电子书库