static的作用有哪些?
C语言中的static的作用有:1.修饰局部变量。2.修饰全局变量。3.修饰函数。
1.修饰局部变量。
如图:
当只用int 定义变量a时,此时程序运行结果为:
程序运行结果为10个2,这是为什么呢??
原因是此时的变量a为局部变量,当主函数中的while循环每调用一次test()的时候,变量a就会被创建,而调用结束时,此时a就会被销毁,当再一次循环调用test()的时候,a又会被创建并赋值为1,所以每次循环,a都会被重新创建一次,每次test()打印的结果都是2;
而利用static对局部变量修饰后:
再次运行程序:
此时运行的结果就是2~11;原因是static对变量a进行了修饰,将变量a的生命周期进行了延长,使a出了它的作用范围后并没有被销毁,如果没有static,每次调用test结束时a都会被销毁。
所以利用static修饰局部变量,可以延长其生命周期。
2.static修饰全局变量。
这是一般使用全局变量的方法,程序可以正常运行,运行结果为:2023
同一个工程下的另一个文件里用全局变量定义g_val,但此时程序会报错
这就需要我们在主函数所在的文件里用extern声明外部符号g_val;
此时程序就能正常运行;而当我们用static在add.c文件中修饰全局变量g_val时:
此时程序就会报错。那这是为什么呢??
首先我们讨论全局变量的特性。全局变量是可以在整个工程中使用的;全局变量是具有外部链接属性的,在其他源文件内部,只要适当的声明就可以使用;
而当static修饰全局变量时,全局变量的外部链接属性就变成了内部链接属性,就只能在自己所在的内部.c文件中使用了,其他.c内部文件内就不能使用了。
所以static修饰全局变量,是会将全局变量的外部链接属性变成内部链接属性的,影响了全局变量的作用域。
3.static修饰函数。
与修饰全局变量类似,当没用static修饰的时候
程序能够正常运行并打印;当static修饰Add函数时
此时程序报错;
原因和static修饰全局变量相同:
函数是具有外部链接属性的,当static修饰函数后,函数的外部链接属性就变成了内部链接属性;
被static修饰的函数只能在自己所在的.c文件中使用。最终相当于影响了作用域。