假设我有一个函数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
}
}
编译器在两种情况下都做了哪些详细的处理?是否存在我应该使用方法(2)的情况,只要func()
中只需要变量?
唯一的区别是当变量在函数内声明时,它只有该函数的局部范围。尽可能减少变量的范围总是很好的做法,所以如果可行的话,你应该这样做。
虽然有时在实现ADTs和类似模块时,您希望多个函数可以访问局部变量。在这种情况下,您将其声明为文件范围。
在某些情况下,将变量放在文件范围是不好的编程习惯,因为它使代码更难以阅读和维护。尽管静态文件范围变量不是全局变量(整个程序不可见),但与全局变量被认为是错误的原因相同。
在其他情况下,最显着的是嵌入式系统,其中只有一个“类”实例正在编写(单例),那么使用文件范围静态变量是常见做法,作为穷人的私有封装方式。
这里有一些调整后的代码来显示变量定义的区别:(来自:What does "static" mean?)
#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 = %d\n", a, sa);
}
void func2()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf(" func2 : a = %d, sa = %d\n", 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 = %d\n", a, sa);
}
void func2()
{
int a = 10;
//static int sa = 10;
a += 5;
sa += 5;
printf(" func2 : a = %d, sa = %d\n", 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
摘要评论(来自原始参考):What does "static" mean?