【发布时间】:2014-05-20 14:51:01
【问题描述】:
static 关键字定义变量如何存储在内存中,即如果已初始化则存储在数据段中,如果未初始化则存储在 BSS 中。但该关键字还指定如何链接变量,即仅限本地范围。
这两件事如何或为什么相关?两者可以分开,还是这是必要的设计考虑?
IOW,为什么如果我希望我的变量在程序期间存在,它必须在内部链接?
【问题讨论】:
-
不,
static关键字没有指定变量是否应该在data或bss段中,它只是决定的初始化状态(对于使用段的系统,例如data和bss)。 -
但这不就是效果吗?已初始化或未初始化的静态变量分别存储在 Data Segment 和 BSS 中,不是吗?即使这是一个实现细节,不一定是标准规定的。
-
局部变量(默认自动)存储在堆栈中,因此是局部变量。全局变量在整个程序生命周期中都是活跃的。 (您在程序期间存在但具有外部链接的变量)如果您添加带有局部变量的静态关键字,其范围保持不变,但生命是直到程序结束。如果使用全局变量添加静态关键字,生命保持不变,但链接是内部的。
-
@MohitJain 是的,我想这是我的问题......为什么会这样?在您提到的示例中,关键字似乎做了两件非常不同的事情。我很好奇他们为什么不使用两个不同的关键字。我敢肯定有一个很好的理由(好吧,无论如何都会希望),我只是不明白它是什么。
-
对于“为什么静态意味着它在 C++ 中的作用”的大多数答案是:“因为 C 是这样定义的。”当它最初是在 C 中定义的时候,将编译器安装到内存中就已经是一个挑战,因此最小化关键词几乎是必要的。