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修饰的局部变量,在变量只在初次运行时进行初始化工作,并且只进行一次。static、extern的使用及注意点总结
static、extern的使用及注意点总结
上面这个程序在第二次调用fun()函数时,a的值时2,并没有进行初始化赋值,这就是static的一个作用。

2.修饰全局变量
对于一个全局变量来说,他既可以在本源文件中被访问,也可以在同一个工程的其他源文件中被访问(需要用extern声明,后面我在细说)。
static、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在声明变量时可不指定类型)既然编译器不检查则不会提示错误,则结果会出现意想不到的问题,所以写程序时一定要注意类型。