假设我有一个函数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()
只需要变量?
答案 0 :(得分:4)
唯一的区别是当变量在函数内部声明时,它只具有该函数的局部范围。尽可能减少变量的范围总是很好的做法,所以如果可行的话,你应该这样做。
虽然有时在实现ADTs和类似模块时,您希望多个函数可以访问局部变量。在这种情况下,您将其声明为文件范围。
在某些情况下,将变量放在文件范围是不好的编程习惯,因为它会使代码更难以阅读和维护。即使静态文件范围变量不是全局变量(整个程序也看不到),这与全局变量被认为是错误的原因相同。
在其他情况下,最显着的是嵌入式系统,其中只有一个"类"你正在编写(单例),然后使用文件范围静态变量是常见的做法,作为一个穷人的私有封装方式。
答案 1 :(得分:1)
这里有一些调整后的代码,用于显示中定义变量的区别: (来自: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?
静态定义的局部变量之间不会丢失它们的值 函数调用。换句话说,它们是全局变量,但是作用域 到他们定义的本地函数。
静态全局变量在他们的C文件之外是不可见的 在。
静态函数在C文件的外部不可见 定义于。