在C中,当外部变量可以以相同的代价服务于它的目的时,静态存储类又有什么用呢?两者都占用可执行文件的数据段中的存储空间。
我有更好的外部variable.If作用域,我希望外部变量的作用域是特定的文件,我不声明这个变量,否则我会看到全局变量静态局部变量的很大灵活性
我们可以在函数外部引用局部静态变量,如果我们有variable.Memory的地址,局部静态变量将在数据段中,而不是在function.So的堆栈框架中,这是静态存储类带到表中的独特功能。
我只想知道static是否有任何我不知道的微妙目的。
发布于 2013-04-04 18:38:29
你写的是一个全局变量有一个“更好”的作用域。这是不正确的。它有更大的范围。更大并不是更好。
如果你需要一个标识符在更多的地方可见,那么更大的可能是必要的,但通常情况并非如此。但更大的范围意味着更多的错误暴露。全局变量使它们更难看到它们使用和更改的程序状态,从而混淆了例程的语义,并增加了由于未能声明局部标识符而导致的错误和其他错误的概率。
特别是,具有外部链接的标识符将与其他库中的标识符发生冲突。考虑一下当您编写一个物理应用程序时会发生什么,拥有一个名为acceleration
的外部标识符,并链接到一个也具有外部标识符acceleration
的物理库。程序将失败。正因为如此,外部标识符通常是糟糕的设计。
我们开发和维护复杂软件的能力的一个重要限制是人为错误。许多编程语言语义对语言进行了限制以防止错误。对于原始计算机,您可以添加两个指针、丢弃堆栈指针、意外地将float
的字节加载到整数寄存器中,等等。好的编程语言使得这些错误很难被错误地处理。
在作用域规则帮助控制全局变量之前,全局变量是更大的错误来源。优秀的程序员会限制其标识符的范围。
发布于 2013-04-04 18:04:39
全局变量是全局的,它可以从任何地方访问。
静态局部变量具有局部作用域。它是静态的,因此它的生命周期贯穿应用程序的整个生命周期,但是它只能从本地作用域访问(无论该作用域是函数、块还是文件)
发布于 2013-04-04 18:08:35
基本的区别在于变量的作用域。
1)全局变量对于整个项目是全局的。假设您的项目有10个不同的文件,那么所有10个文件都可以访问全局变量(请参阅如何使用外部变量)。
2)静态变量/函数可以由定义它的函数/文件使用。它不能由项目中的任何其他文件使用。
但是,您可以通过传递变量的引用来修改func2()中的静态变量(在func1()中定义)。请看下面的例子。
void func2(int *i)
{
(*i)++;
}
void func1()
{
static int i;
i=1;
printf("%d\n", i);
func2(&i);
printf("%d\n", i);
}
int main()
{
func1();
return 0;
}
正如您在上面看到的,func1()具有不能被func2()直接操作的static int i
,但是如果您传递变量的引用,您仍然可以像普通变量一样操作该变量。
希望这能帮上忙。
https://stackoverflow.com/questions/15808049
复制相似问题