在C中,您可以拥有可在文件中的每个位置查看的外部静态变量,而内部静态变量仅在函数中可见但是持久
例如:
#includevoid foo_bar( void ) { static counter = 0; printf("counter is %d\n", counter); counter++; } int main( void ) { foo_bar(); foo_bar(); foo_bar(); return 0; }
输出将是
counter is 0 counter is 1 counter is 2
我的问题是你为什么要使用内部静态变量?如果你不希望你的静态变量在文件的其余部分可见,那么该函数真的不应该在它自己的文件中吗?
这种混淆通常是因为static
关键字有两个目的.
在文件级别使用时,它控制其对象在编译单元外的可见性,而不是对象的持续时间(可见性和持续时间是我在教育会话期间使用的外行人的术语,ISO标准使用您可能想要学习的不同术语,但我发现他们混淆了大多数初学者).
在文件级别创建的对象已经根据它们处于文件级别的事实来确定它们的持续时间.然后static
关键字使它们对链接器不可见.
在函数内部使用时,它控制持续时间,而不是可见性.可见性已经确定,因为它在函数内部 - 在函数外部看不到它.在static
这种情况下的关键字,使得在同一时间作为文件级对象要创建的对象.
注意,从技术上讲,函数级静态可能不一定存在,直到首次调用该函数(这对于C++及其构造函数可能有意义),但我曾经使用的每个C实现都创建了它的函数级静态.时间作为文件级对象.
此外,虽然我使用的是"对象"这个词,但我并不是指C++对象的意思(因为这是一个C问题).这只是因为static
可以应用于文件级别的变量或函数,我需要一个无所不包的词来描述它.
函数级静态仍然使用相当多 - 如果不能满足它们,它们可能会给多线程程序带来麻烦但是,如果你知道你在做什么(或者你没有线程),它们是最好的方法保持跨多个函数调用的状态,同时仍然提供封装.
即使线程,有技巧,你可以在做功能(如线程特定数据的分配中的功能),使它能够发挥而不必暴露内部功能.
我能想到的唯一其他选择是全局变量,并且每次都将"状态变量"传递给函数.
在这两种情况下,您将函数的内部工作方式暴露给其客户端,并使函数依赖于客户端的良好行为(总是一个冒险的假设).
它们用于实现类似的工具strtok
,它们会导致重入问题......
在使用此工具愚弄之前要仔细考虑,但有时候它们是合适的.
例如,在C++中,它被用作获得单身人士的一种方式
SingletonObject& getInstance() { static SingletonObject o; return o; }
用于解决初始化顺序问题(虽然它不是线程安全的).
广告"该功能不应该在自己的文件中"
当然不是,那是胡说八道.编程语言的许多重点是促进隔离,因此重用代码(局部变量,过程,结构等都这样做),这只是另一种方法.
顺便说一句,正如其他人所指出的,对全局变量几乎每一个观点也适用于静态变量太多,因为他们是事实上的全局变量.但是有很多情况下可以使用全局变量,人们也可以.