【濡白的C语言】初学者-从零开始-4(欢喜冤家static与extern)

本文详细介绍了C语言中static和extern关键字的用法,static用于延长局部变量的生命周期或限制全局变量的作用域,而extern用于在不同源文件间声明和使用全局变量或函数。理解这两者的区别对于编写可维护的C程序至关重要。建议在使用extern调用函数时养成良好习惯,避免在C++中直接调用未声明的函数。同时,static也可用于隐藏函数,防止在其他源文件中被调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本次主要介绍两个关键字static、extern,主要与函数、变量的作用域与生命周期有关。

目录

extern

C语言函数隐式存储方式

全局变量

函数

static

局部变量

全局变量

函数

 总结与常见应用场景


extern

C语言函数隐式存储方式

        简单来说,extern关键字就是声明一个不在此源文件下的变量或者函数。可以看到,在下图中,我们创建了两个源文件,将一个函数放于static.c中,而在lesson_4.c中调用了该函数,但是系统并没有给出报错。原因就在于C语言中函数默认是以extern的形式存储的,即在C语言中,不同源文件内的函数是可以直接调用的。

全局变量

        而C语言中变量则不是默认extern存储类型,如下图,我们可以发现,当我们试图使用k时,系统给出报错,k未定义。

         而当我们在lesson_4.c中用extern声明 k 之后,该报错自然也就消失了,k也正常打印。

函数

         也许有同学会觉得奇怪,刚才不是说了函数默认存储类型就是extern吗?为什么这里还要提函数呢?这是因为虽然C语言默认是extern,但是对于其他语言,甚至最接近的c++都不是这样的,因此不使用extern声明直接调用是一种非常不好的习惯。如图,将源文件修改为.cpp文件:

         .cpp表示该文件是一个c++文件,可以看到此时,系统再次给出报错,函数未声明,使用extern后解决

         因此,同样建议同学们在使用.c文件调用其他源文件的函数时也使用extern声明,养成一个好的习惯!

static

        同学们因该也注意到我们的标题了,“欢喜冤家”,说的就是static和extern的用法基本上是相反的。

局部变量

        首先介绍目前阶段我们可能见过的最多的static用法——作用于局部变量。此时局部变量的作用域不变,但是生命周期变长。

        如上图,通常我们定义局部变量每次离开函数的时候,局部变量都会被销毁,下次使用的时候会重新定义,也就是如果我们使用int a = 0,此时函数每次的返回值就是1,因此将会打印十个1,但是使用static之后,每次我们离开函数时,a并不会被销毁, 再次进入时,也不会重新创建,也就如上图打印出1 - 10。

全局变量

        对于全局变量,我们不需要延长他的生命周期,因为全局变量本身生命周期就随整个程序一起,但是我们可以使用static让全局变量无法被extern声明,如图:

        也就是为什么称static与extern是一对冤家了。 

函数

        同样的,对于函数,static也能使其无法被extern所声明,如图:

 总结与常见应用场景

        extern的主要作用是使另一个源文件中的变量或函数能被另一个文件所调用,而static则主要用两个作用,其一是使局部变量不会因出函数而被销毁,其二是使变量或函数无法被另一个源文件调用。

        extern应用场景主要常见于某一个函数需要在另一个源文件中多次使用,减少函数额外传参带来的麻烦,static则运用于两个源文件中可能出现重定义(名字相同的变量或者函数)的时候限定某一个函数的使用范围。

创作不易,感谢三连!

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值