首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中的内部静态变量,你会使用它们吗?

C中的内部静态变量,你会使用它们吗?
EN

Stack Overflow用户
提问于 2009-02-10 23:21:08
回答 13查看 15.6K关注 0票数 23

在C中,外部静态变量可以在文件中的任何位置都可见,而内部静态变量仅在函数中可见,但是持久变量

例如:

代码语言:javascript
运行
复制
#include <stdio.h>

void foo_bar( void )
{
        static counter = 0;
        printf("counter is %d\n", counter);
        counter++;
}
int main( void )
{
        foo_bar();
        foo_bar();
        foo_bar();
 return 0;
}

输出将是

代码语言:javascript
运行
复制
counter is 0
counter is 1
counter is 2

我的问题是,为什么要使用内部静态变量?如果您不希望静态变量在文件的其余部分可见,那么函数不应该真的在它自己的文件中吗?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2009-02-11 00:56:16

这种混淆通常是因为static关键字有两个目的。

当在文件级使用时,它控制其对象在编译单元之外的可见性,而不是对象的持续时间(可见性和持续时间是我在教育会话中使用的外行术语,ISO标准使用了不同的术语,您可能最终会想要学习这些术语,但我发现它们会让大多数初学者感到困惑)。

在文件级创建的对象已经根据它们在文件级的事实决定了它们的持续时间。然后,static关键字只会使它们对链接器不可见。

当在函数中使用时,它控制持续时间,而不是可见性。可见性已经决定了,因为它在函数内部-它不能在函数外看到。在本例中,关键字static会导致对象与文件级对象同时创建。

请注意,从技术上讲,在第一次调用函数之前,函数级静态函数可能不一定存在(这对于C++及其构造函数来说可能是有意义的),但我使用过的每个C实现都会同时创建它的函数级静态对象。

另外,虽然我使用了“对象”这个词,但我并不是指C++对象(因为这是一个C问题)。这只是因为static可以应用于文件级的变量或函数,而我需要一个包罗万象的词来描述它。

函数级静态仍然被大量使用--如果不能满足这一要求,它们可能会在多线程程序中造成麻烦,但是,如果你知道你在做什么(或者你不是在进行线程处理),它们是在多个函数调用中保留状态的最好方法,同时仍然提供封装。

即使使用线程,您也可以在函数中使用一些技巧(例如,在函数中分配线程特定的数据),使其可以工作,而不会不必要地暴露函数内部。

我能想到的其他选择就是全局变量,并且每次都会向函数传递一个“状态变量”。

在这两种情况下,您都会将函数的内部工作方式公开给它的客户端,并使函数依赖于客户端的良好行为(总是一个有风险的假设)。

票数 38
EN

Stack Overflow用户

发布于 2009-02-10 23:26:01

它们被用来实现像strtok这样的工具,并且它们会导致可重入性问题……

在使用这个工具之前要仔细考虑,但有时它们是合适的。

票数 9
EN

Stack Overflow用户

发布于 2009-02-10 23:28:35

例如,在C++中,它被用作获取单例实例的一种方法

代码语言:javascript
运行
复制
SingletonObject& getInstance()
{
  static SingletonObject o;
  return o;
}

它用于解决初始化顺序问题(尽管它不是线程安全的)。

Ad“函数不应该在它自己的文件中”

当然不是,那是胡说八道。编程语言的主要目的是促进代码的隔离和重用(本地变量、过程、结构等都可以做到这一点),而这只是另一种实现方式。

顺便说一句,正如其他人指出的那样,几乎所有反对全局变量的论点也适用于静态变量,因为它们实际上是全局变量。但在很多情况下,可以使用全局变量,人们也是这样做的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/534735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档