C语言中static与extern用法总结

前言-变量的储存方法

在C语言中,供用户使用的储存空间分为3个部分,程序区、静态储存区和动态储存区。其中,程序区存放的是可执行程序的机器指令,静态储存区存放的是在程序运行期间需要占用固定储存单元的变量,如全局变量;动态存储区存放的是程序运行期间需要动态分配储存空间的变量,如函数的形参变量、局部变量等。
变量的存储属性就是数据在内存中的存储方法,可分为两大类:动态存储和静态存储。

1、static与extern在变量存储上的区别

1.1.1static既可用于存储局部变量,也可用于存储全局变量

1.1.1static用于存储局部静态变量

如果希望函数调用结束后仍然保留其中定义的局部变量的值,则可将局部变量定义为局部静态变量。一般形式为

static 类型说明符 变量名;

特点如下:
(1)局部静态变量是在静态存储区分配储存单元,在整个程序运行期间都不释放。因此,在函数调用结束后,它的值并不消失,其值能够保证连续性。
(2)局部静态变量是在编译过程中赋初值的,且只赋一次初值,在程序运行期间其初值已定,以后每次调用函数时不再赋初值,而是保留上一次函数调用结束后的结果;
(3)局部静态变量的默认初值为0(对数值型变量),或空字符(对字符型变量)。

1.1.2static用于存储静态全局变量

在程序设计时,如果希望在一个文件中定义的全局变量仅限于被本文件引用,而不能被其他文件访问,则可以在定义此全局变量是,在前面加上关键字static。例如:

static int x;

注意,此时全局变量的作用于仅限于本文件,在其他文件中即使使用了extern说明,也无法使用该变量。(可看文全文后回头再看这句话)

1.2extern用于存储外部全局变量

对于一个很大的程序,为了编写、调试、编译和修改程序的方便,常把一个程序设计成多个文件的模块结构。每个模块或文件完成一个或几个较小的功能。这样,就可以先对每个模块或每个文件进行单独编译,然后再讲各模块连接在一起。因此,在多个源程序文件的情况下,如果在一个文件中要引用其他文件中定义的全局变量,则需要在引用此变量的文件中,用extern进行说明
例如在prog1.c中存在一个全局变量a,如果想在prog2.c中使用全局变量a,则需要在prog2.c中提前说明:

extern int a;

这行语句说明该变量a已经在其他文件中被定义过,本文件不必在为其分配内存。
注意:
(1)extern只能用来说明变量,不能用来定义变量,因为其不产生新的变量,只是宣布该变量已经在其他地方有过定义。因此,供其他文件访问的全局变量,在程序中只能定义一次,但是在不同的地方可以多次被说明为外部变量。
(2)extern不能用于初始化变量,例如

extern int x=1;

为错误用法。
(3)静态全部变量与外部全局变量在同一文件内的作用域是一样的,但是外部全局变量的作用域可延伸至其他程序文件,而静态全局变量在被定义的源程序文件以外是不可见的。

2、extern与static在函数定义上的区别-内部函数与外部函数

2.1 static与内部函数

内部函数也称为静态函数,它只能被本文件中的其他函数所调用。此处的“静态”不是指存储方式,而是指对函数的作用域仅限于本文件。内部函数定义的一般形式:

static 类型说明符 函数名 (形式参数生命)

例如:

static float sum(float x, float y)
{
}

使用内部函数的意义

使用内部函数,可以使函数的使用范围仅限于本文件,如果在不同的文件中有同名的内部函数,也不会互相干扰。这样有利于不同的人分工编写不同的函数,而不必担心函数是否同名。

2.2 extern 与外部函数

在定义函数时,如果使用了关键字extern ,表明此函数是外部函数。例如:

extern char compare( char s1, char s2)
{
}

由于函数都是外部性质的,因此在定义函数时,关键字extern可以省略。
但是,在调用函数的文件中,一般要用extern说明所调用的函数是外部函数。例如,若在源文件A中调用另一源文件B中的函数compare,则需要在源文件A中对函数compare进行说明,格式如下:

extern char compare();

参考资料

本文主要参考《C语言程序设计教程》第3版, 朱鸣华等编著。

  • 12
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值