变量的存储类别 内部函数和外部函数
以下详细内容可以参看谭浩强《C语言程序设计 第三版》 中第八章 函数。
1、用 static声明局部变量
对静态局部变量的说明:
1) 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间
都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数
调用结束后即释放。
2) 静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时
进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3) 如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值 0 (对
数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是
一个不确定的值。
4)虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
2、用static声明外部变量
1)在程序设计中,常由若干人分别完成各个模块,个人可以独立地在其设计的文件中使用相同的外部变量名而互不相干。只需在每个文件中的外部变量前加上static即可。
2)需要指出:不要误认对外部变量加static声明后才是静态存储方式(存放在静态存储区中),而不加static的是动态存储。两种形式的外部变量都是静态存储方式(存放在静态存储区),只是作用范围不同而已,都是在编译时分配内存的。
3、用extern声明外部变量
1) 外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。编译时将外部变量分配在静态存储区,在单个文件中,一般做法是外部变量的定义放在引用他的所有函数之前,这样可以避免在函数中多加一个extern声明。
2)在多文件中声明外部变量,extern既可以用来扩展外部变量在本文件中的作用域,又可以使外部变量的作用域从一个文件扩展到程序中的其他文件,那么系统怎么区别处理呢?实际上,在编译的时遇到extern时,现在本文件中找到外部变量的定义,如果找到,就在本文件中扩展作用域;如果找不到,就在连接时从其他文件中找外部变量的定义。如果从其他文件中找到了,就将作用域扩展到本文件;如果找不到,就按出错处理。
4、内部函数和外部函数
1)内部函数:如果一个函数只能被本文件中其他函数所调用,称为内部函数。
2)外部函数:在定义函数时,如果在函数首部的最左端加关键字extern,则表示此函数是外部函数,可供其他文件调用,C语言规定,如果在定义函数时省略extern,则隐含为外部函数。在需要调用此函数的文件中,用extern对函数作声明,表示该函数是在其他文件中定义的外部函数。 由于函数的本质是外部的,在程序中经常要调用外部函数,为方便编程,C语言允许在声明函数时省写extern,由此可进一步理解函数原型的作用。用函数原型能够把函数的作用域扩展到定义该函数的文件之外(不必使用extern),只要在使用该函数的每一个文件中包含该函数的函数原型即可,函数原型通知编译系统:该函数在本文件中稍后定义,或在另一文件中定义。为了减少程序设计者的困难,所以在调用系统函数时一般用#include命令包括所有函数的原型和其他有关信息。
posted on 2013-07-31 20:39 lanlingshan 阅读(715) 评论(0) 编辑 收藏 举报