ANSI-C中的static是什么意思?

35

可能是重复问题:
C语言中的static关键字是什么意思?

C语言中的static关键字是什么意思?

我在使用ANSI-C时看到过几个代码示例,它们在变量前面和函数前面都使用了static关键字。在变量的情况下使用的目的是什么?在函数的情况下使用的目的又是什么?


我做了,但是很难理解确切的目的。我能够理解一些关于变量的使用,但是对于函数的使用就有些困难了。 - Sency
1
你找到这个了吗:https://dev59.com/lXRB5IYBdhLWcg3wn4UL - Mitch Wheat
1
请看这里:https://dev59.com/33NA5IYBdhLWcg3wfN2O - Mitch Wheat
2个回答

60

简单来说,当定义变量时使用 static 关键字有两种用法:

1- 在文件作用域内定义带有 static 关键字的变量,即在函数外部定义,这些变量只能在该文件内部使用。任何尝试从其他文件访问它们的行为都将导致链接时未解决的符号错误。

2- 在函数内部的块中定义为 static 的变量可以跨越不同的代码块调用而存在或“生存”。如果变量被初始化,那么它们只会被初始化一次。通常情况下,static 变量保证默认初始化为 0


8
关于第一点:static关键字也可以应用于函数,同样将其隐藏起来,不对外暴露。 - datenwolf
7
在其他版本的这个问题中已经提到过,但是针对从谷歌跳转而来的用户,严格来说,“1”指的是编译单元而非文件。 - Jared
@Roux 哈斯:「如果它们被定义并初始化了」这是什么意思?如果它们在被定义时被初始化为非零值? - user749127

34
在函数体中使用static作为变量存储分类符,使该变量在函数调用之间保留其值。可以说,函数内的静态变量是全局变量,但仅对该函数可见。这种使用static总是使得它所在的函数不安全,因此应避免使用。
另一种用例是在全局范围内使用static,即用于全局变量和函数:静态函数和全局变量在编译单元中是局部的,即它们不会出现在编译二进制对象的导出表中。因此,它们不会污染命名空间。在问题的C文件之外声明所有函数和全局变量为静态,以使其不可从外部访问,是一个好主意!只要注意静态变量不能放在标头文件中(除非是很少见的特殊情况)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接