打印
[学习资料]

static 全局变量与普通的全局变量有什么区别?

[复制链接]
502|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yorkbarney|  楼主 | 2025-2-23 22:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
static 全局变量与普通的全局变量有什么区别?static 局部变量和普通局部变量有什么 区别?static 函数与普通函数有什么区别?
    全局变量(外部变量)的说明之前再冠以 static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
    从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。static 函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static 全局变量与普通的全局变量有什么区别:
static 全局变量只初使化一次,防止在其他文件单元中被引用;
static 局部变量和普通局部变量有什么区别:
static 局部变量只被初始化一次,下一次依据上一次结果值;
static 函数与普通函数有什么区别:
static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

使用特权

评论回复
沙发
jcky001| | 2025-2-24 10:54 | 只看该作者
嵌入式入门级知识帖了

使用特权

评论回复
板凳
timfordlare| | 2025-3-9 20:42 | 只看该作者
从定义位置开始,直到整个源文件的末尾。

使用特权

评论回复
地板
yorkbarney|  楼主 | 2025-3-10 10:10 | 只看该作者
普通全局变量:具有外部链接性(除非显式指定为static),其存储时期是程序的整个运行期间。它们在程序开始执行前分配,并在程序结束时释放。
static全局变量:具有内部链接性,其存储时期也是程序的整个运行期间,但是它们仅在声明它们的文件内可见。这意味着,即使在不同的文件中声明了同名变量,它们也会被视为不同的变量。

使用特权

评论回复
5
gygp| | 2025-3-10 11:40 | 只看该作者
未经初始化的静态全局变量会被程序自动初始化为0(而函数体内声明的自动变量的值是随机的,除非它被显式初始化)。

使用特权

评论回复
6
plsbackup| | 2025-3-10 14:44 | 只看该作者
static全局变量:由于其作用域限制在定义它的源文件内,因此有助于减少命名冲突的可能性,并提高代码的模块化和可维护性。
普通全局变量:由于其作用域为整个程序,因此在大型项目中可能导致命名冲突和难以追踪的依赖关系。

使用特权

评论回复
7
macpherson| | 2025-3-10 17:53 | 只看该作者
普通全局变量:
具有外部链接性,这意味着它可以在其他源文件中通过extern关键字进行访问。
static全局变量:
具有内部链接性(或称为文件作用域),即它只能被声明它的文件内的函数访问,而不能被其他文件访问。

使用特权

评论回复
8
穷得掉渣大侠| | 2025-3-10 21:44 | 只看该作者
static 全局变量和普通全局变量的存储方式都是静态存储,它们在程序的整个运行期间都存在

使用特权

评论回复
9
elsaflower| | 2025-3-11 15:04 | 只看该作者
不同源文件可以使用同名变量而不冲突。

使用特权

评论回复
10
houjiakai| | 2025-3-11 21:05 | 只看该作者
由于static全局变量的作用域局限于一个源文件内,因此其他文件中可以定义相同名字的变量而不会发生冲突。

使用特权

评论回复
11
pmp| | 2025-3-12 15:36 | 只看该作者
普通全局变量        外部链接(External Linkage)‌:可在多个文件中共享
static 全局变量        内部链接(Internal Linkage)‌:仅限当前文件使用

使用特权

评论回复
12
abotomson| | 2025-3-12 17:49 | 只看该作者
减少全局变量的数量              

使用特权

评论回复
13
wengh2016| | 2025-3-12 19:57 | 只看该作者
普通全局变量:
作用域是整个源程序。即,当一个源程序由多个源文件组成时,普通全局变量在各个源文件中都是有效的。
可以通过在另一个文件中使用extern关键字来声明并访问这个全局变量。
static全局变量:
作用域被限制在声明它的文件内。即,它只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能使用。
这种限制可以避免在其他源文件中因同名变量而引发的冲突和错误。

使用特权

评论回复
14
albertaabbot| | 2025-3-12 22:07 | 只看该作者
static全局变量:其作用域仅限于定义它的源文件内部。这意味着在其他源文件中,即使使用extern关键字声明,也无法直接访问或引用这个静态全局变量。
普通全局变量:其作用域为整个程序。在整个程序运行期间,包括所有源文件,都可以访问和修改这些变量。

使用特权

评论回复
15
mmbs| | 2025-3-14 10:27 | 只看该作者
static全局变量:通常存储在程序的全局数据区域,但具体位置可能因编译器和操作系统而异。
普通全局变量:也存储在全局数据区域,但其值在整个程序运行期间可以被改变。

使用特权

评论回复
16
51xlf| | 2025-3-14 12:39 | 只看该作者
普通全局变量:在整个程序范围内可见,可以被程序中的任何函数访问,只要它们有适当的权限。
static全局变量:只在声明它们的文件内可见。这有助于封装,减少了命名冲突,并限制了变量的作用域。

使用特权

评论回复
17
robincotton| | 2025-3-14 14:52 | 只看该作者
用于跨文件共享的全局状态              

使用特权

评论回复
18
elsaflower| | 2025-3-14 16:58 | 只看该作者
静态全局变量(和静态局部变量)在声明时若未显式初始化,则会被程序自动初始化为0。

使用特权

评论回复
19
chenci2013| | 2025-3-14 21:12 | 只看该作者
默认具有外部链接性,允许其他源文件通过 extern 关键字引用。

使用特权

评论回复
20
kmzuaz| | 2025-3-15 00:18 | 只看该作者
普通全局变量:默认具有外部链接性,这意味着它们可以在不同的编译单元(源文件)之间共享。如果在一个文件中定义了一个全局变量,并在另一个文件中声明了它(通过使用extern关键字),则这两个声明引用的是同一个变量。
static全局变量:具有内部链接性,这意味着它们只能在声明它们的编译单元内部可见。它们不能通过extern声明在其他文件中使用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

1358

帖子

1

粉丝