当了解到 extern
和 static
在CC++中的变量,我遇到了这个 回答.
也许我错过了什么,但这个答案让我对我的一段代码产生了疑问。
假设我有以下文件。
static int global_foo = -1;
void doSomething(void);
#include "header.h"
void doSomething(void) {
global_foo = 1;
}
#include "header.h"
int main(void) {
doSomething();
printf("%d\n", global_foo);
}
主函数中的printf的输出到底是什么?我的解释是,由于 global_foo
包括两次,将有两个不同的 global_foo
因此,一个这样的变化将只影响到 "我"。global_foo
的文件。
你的评估是正确的。
因为 global_foo
被宣布为 static
每一个源文件都有自己独特的同名变量,改变一个变量不会影响另一个变量。
正因为如此,程序将打印 -1
,因为 global_foo
main.c中的变量没有变化。
全局变量有 static
的存储时间,所以没有必要在其中加入 static
修饰符来明确说明它的存储持续时间。当您将一个全局变量声明为 static
在一个翻译单元内,您只是说它在该翻译单元内有内部联系。这意味着它只能通过翻译单元中的名称来识别。
所以,如果您将一个变量声明为 static
在头文件中,每个包含它的翻译单元都会得到自己的变量副本,这个副本与其他所有的变量不同。
如果您有一个返回变量地址的函数,即:"变量"。
int *getStaticAddress ()
{
return &static_var;
}
你可以用它来访问翻译单元之外的变量。