打印
[学习资料]

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

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

使用特权

评论回复
29
andy520520| | 2025-3-23 14:49 | 只看该作者
正确的描述应该是从生存期和作用域上来说的

使用特权

评论回复
28
星空魔法师| | 2025-3-19 13:25 | 只看该作者
未经初始化的静态全局变量会被自动初始化为0

使用特权

评论回复
27
minzisc| | 2025-3-15 19:39 | 只看该作者
普通全局变量:生存期是整个程序运行期间。它们在程序启动时被初始化,在程序结束时被销毁。
static 全局变量:生存期也是整个程序运行期间。它们在程序启动时被初始化,在程序结束时被销毁。

使用特权

评论回复
26
jimmhu| | 2025-3-15 17:51 | 只看该作者
static全局变量与普通的全局变量在作用域、存储方式以及链接性上存在显著差异。

使用特权

评论回复
25
yeates333| | 2025-3-15 15:50 | 只看该作者
作用域是整个源程序。当一个源程序由多个源文件组成时,普通全局变量在各个源文件中都是有效的。

使用特权

评论回复
24
cemaj| | 2025-3-15 13:59 | 只看该作者
static全局变量:从程序开始运行到程序结束,static全局变量始终保持其值,且仅初始化一次。
普通全局变量:同样从程序开始运行到程序结束,但它们可能在整个程序中被多次修改和访问。

使用特权

评论回复
23
chenci2013| | 2025-3-15 12:15 | 只看该作者
普通全局变量
需要跨文件共享数据的场景(如多模块共享配置参数)。
需谨慎使用,避免命名冲突和耦合性过高。
static 全局变量
模块内部私有数据:仅限当前文件使用的变量(如模块内部状态标志)。
隐藏实现细节:配合 static 函数,实现面向对象的“私有成员”效果。
避免命名污染:大型项目中防止同名变量冲突。

使用特权

评论回复
22
lzbf| | 2025-3-15 10:23 | 只看该作者
普通全局变量        从定义位置开始到文件结尾,可以被本文件所有函数访问,其他文件通过 extern 声明后也可访问
static 全局变量        仅限于定义它的文件内部,其他文件无法访问(即使使用 extern)

使用特权

评论回复
21
cemaj| | 2025-3-15 07:48 | 只看该作者
普通全局变量容易导致 命名冲突(不同文件定义同名全局变量会引发链接错误)。
static 全局变量通过限制作用域,实现 模块化封装,避免变量被外部文件误修改。

使用特权

评论回复
20
jtracy3| | 2025-3-15 03:22 | 只看该作者
普通全局变量:如果没有显式初始化,默认会被初始化为0(对于整数类型)或NULL(对于指针类型)。
static 全局变量:如果没有显式初始化,默认也会被初始化为0(对于整数类型)或NULL(对于指针类型)。

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

本版积分规则

35

主题

1358

帖子

1

粉丝