static、extern的使用及注意点总结

乱世枭雄:static和extern

这几天在学习c的基本知识 将今天所学的static和extern知识总结归纳一下

首先在c程序的国度,main就是这个国家的君主,而各个函数则是军阀,main通过“下传圣旨”(就是参数)来调用各个军阀(函数)。然而static函数树立了自己的政权,并不是一味的听从于main函数,他主要不服从的是:static私藏小金库(就是空间)。而extern更加狂妄,不同的国家即不同的.c文件之间可以通过extern互相私通传递信息。二者联合作乱,让编程者逻辑混淆。那么接下来 我就来说一说这两位枭雄。

政权旗帜static
static就是用来修饰变量,static的空间是在内存中的静态区域分配的。
1.修饰局部变量:
(1).一般情况下,局部变量是存放在栈区的,并且他的生命周期随着该语句块执行结束时便结束了。但是如果用stctic修饰了之后,他的生命周期就会持续到整个程序结束之后再结束,需要注意的是static修饰的局部变量的生命周期和储存空间虽然发生变化,但是他的作用域没有发生变化,他任然还是一个局部变量,出了语句块后便无效了。(这里顺带提一下,作用域是指局部变量在某函数中定义后,仅在此函数内有效,包括在主函数中定义的变量也只能在主函数中使用。局部变量是可以重名的,但如果局部变量和全局变量重名,在局部变量的作用域中,全局变量会被屏蔽)。
(2).这点很容易出错,在使用static修饰的局部变量,在变量只在初次运行时进行初始化工作,并且只进行一次。在这里插入图片描述
在这里插入图片描述
上面这个程序在第二次调用fun()函数时,a的值时2,并没有进行初始化赋值,这就是static的一个作用。

2.修饰全局变量
对于一个全局变量来说,他既可以在本源文件中被访问,也可以在同一个工程的其他源文件中被访问(需要用extern声明,后面我在细说)。
在这里插入图片描述
上面的程序a是file1.c中的全局变量,所以他的作用域是不仅在本源文件中,同一工程的源文件也能访问。但是将int a=1;改为static int a=1;则在file2.c中是访问不了a变量的**,原因是static对全局变量进行修饰时会改变他的作用域,由原来的整个工程变为本源文件可见。**

3.修饰函数
与修饰全局变量大同小异

外来的和尚会念经extern

1.extern用来修饰不是本源文件的变量或函数,当我们在本文件中试图引用外部全局变量或函数时,可以在其前面加上extern表示其实外来的和尚。
2.当extern修饰自己源文件内定义的变量时,考虑在一个.h中声明了一个变量a,而包含了该头文件的,c中定义了a,这会出现这种现象。即同源文件中一个定义多个声明的情况。
3.初始化变量的就是定义,其余都是声明。加了extern的肯定时声明。在函数体中使用其他源文件中的变量时,必须使用extern关键字,因为在函数体中默认时局部变量,但咱们是想引用全局变量的,不能改错成咱们自己定义个局部变量。
4.extern函数
多个源文件共享函数时,编译器不会对外部函数的参数类型,参数个数和返回值类型进行检查,只要函数名相同就可以(就是说extern在声明变量时可不指定类型)既然编译器不检查则不会提示错误,则结果会出现意想不到的问题,所以写程序时一定要注意类型。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex、WY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值