C语言中的extern和static关键字详解

一、基本概念

局部变量:函数内部定义的变量(包括定义在函数内部复合语句中的变量)。

全局变量:定义在函数外部的变量。

作用域:任何标识符(包括变量、函数名、符号常量及新的数据名)都有它的作用范围,此范围称为该标识符的作用域。比如符号常量的作用域是从定义符号常量的地方开始到包含这个#define命令(作用于该符号常量)的文件末尾或者遇到#undef命令(作用于该符号常量)为止。


二、函数作用

关键字extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。

关键字static也可置于变量或者函数前,static可以用于修饰局部变量以扩展其生存期(使其在被调用的函数前就生成,直到程序退出才消亡),也可以用于修饰全局变量,此时它的作用在于限制该全局变量的作用域,使其只有在定义该全局变量的文件中才能使用。另外,对于static还可以将函数声明为内部函数(静态函数),使该函数只能在其定义所在的文件中使用。若在不同文件中存在同名的内部函数,则互不干扰。

三、应用实例

在实际的工程中可能会有很多的源文件,我们假设一个项目中存在源文件a.c和b.c。

源文件a.c如下:

static int i;                //只在a.c中用
int j; //在工程里用
static void init()          //只在a.c中用
{
}
void callme()              //在工程中用
{
static int sum;            //只在callme函数中用
}

上面的全局变量i和init()函数只能用在a.c文档中,全局变量sum的作用域只在callme里。变量j和函数callme()的全局限扩充到整个工程文档。所以能够在下面的b.c中用extern关键字调用。extern告诉编译器这个变量或函数在其他文档里已被定义了。

源文件b.c如下:

extern int j;                //调用a文档里的
extern void callme();   //调用a文档里的
int main()
{
...
}


在编写程序时,需要注意以下原则:

1.若全局变量仅在单个C文档中访问,则能够将这个变量修改为静态全局变量,以降低模块间的耦合度;

2.若全局变量仅由单个函数访问,则能够将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

3.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章