假设我有一个函数void func()
,并在该函数中使用变量testVar
。此外,我需要变量在离开函数后保持不变。通常,我会在函数(1)中使用一个静态变量来实现这一点。但是,当我使用全局变量来代替(2)时,有什么区别?
static int testVar = 0; //global variable instead(2)
void func()
{
static int testVar = 0; //static variable inside of the function(1)
if(testVar++){
//do something
}
}
编译器在这两种情况下都详细做了什么?如果变量仅在func()
中需要,是否存在我应该使用方法(2)的场景?
唯一的区别是,当变量在函数内部声明时,它只对该函数具有局部作用域。尽可能地缩小变量的范围总是一种很好的做法,所以如果这是可能的,你应该这样做
尽管有时在实现ADT和类似模块时,您希望多个函数可以访问一个局部变量。在这种情况下,您可以在文件范围内声明它。
在某些情况下,将变量放在文件范围内是一种糟糕的编程做法,因为这会使代码更难读取和维护。这与为什么全局变量被认为是坏的问题是一样的,即使静态文件范围变量不是全局的(它对整个程序不可见)。
在其他情况下,最显著的是嵌入式系统,其中只有您正在编写的"类"的一个实例(singleton),那么使用文件范围静态变量是常见的做法,这是穷人进行私有封装的方法。
以下是一些经过调整的代码,用于显示之间的差异,中定义了变量:(来自:"静态"是什么意思?)
#include <stdio.h>
//static int sa = 10;
void func1()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf("func 1: a = %d, sa = %dn", a, sa);
}
void func2()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf(" func2 : a = %d, sa = %dn", a, sa);
}
int main()
{
int i,j;
for (i = 0; i < 10; ++i){
func1();
}
for (j = 0; j < 10; j++)
{
func2();
}
}
生产:
func 1: a = 15, sa = 15
func 1: a = 15, sa = 20
func 1: a = 15, sa = 25
func 1: a = 15, sa = 30
func 1: a = 15, sa = 35
func 1: a = 15, sa = 40
func 1: a = 15, sa = 45
func 1: a = 15, sa = 50
func 1: a = 15, sa = 55
func 1: a = 15, sa = 60
func2 : a = 15, sa = 15
func2 : a = 15, sa = 20
func2 : a = 15, sa = 25
func2 : a = 15, sa = 30
func2 : a = 15, sa = 35
func2 : a = 15, sa = 40
func2 : a = 15, sa = 45
func2 : a = 15, sa = 50
func2 : a = 15, sa = 55
func2 : a = 15, sa = 60
而
#include <stdio.h>
static int sa = 10;
void func1()
{
int a = 10;
// static int sa = 10;
a += 5;
sa += 5;
printf("func 1: a = %d, sa = %dn", a, sa);
}
void func2()
{
int a = 10;
//static int sa = 10;
a += 5;
sa += 5;
printf(" func2 : a = %d, sa = %dn", a, sa);
}
产生
func 1: a = 15, sa = 15
func 1: a = 15, sa = 20
func 1: a = 15, sa = 25
func 1: a = 15, sa = 30
func 1: a = 15, sa = 35
func 1: a = 15, sa = 40
func 1: a = 15, sa = 45
func 1: a = 15, sa = 50
func 1: a = 15, sa = 55
func 1: a = 15, sa = 60
func2 : a = 15, sa = 65
func2 : a = 15, sa = 70
func2 : a = 15, sa = 75
func2 : a = 15, sa = 80
func2 : a = 15, sa = 85
func2 : a = 15, sa = 90
func2 : a = 15, sa = 95
func2 : a = 15, sa = 100
func2 : a = 15, sa = 105
func2 : a = 15, sa = 110
总结意见(来自原始参考资料):什么是";静态";意思是
静态定义的局部变量在函数调用。换句话说,它们是全局变量,但作用域到它们在中定义的本地函数
静态全局变量在C文件之外不可见,它们
在.中定义静态函数在C文件之外不可见,它们是
定义于.