在学习C/C++中的extern
和static
变量时,我发现了这个答案。
也许我遗漏了一些要点,但这个答案引起了人们对我的代码的怀疑。
假设我有以下文件:
- header.h
static int global_foo = -1;
void doSomething(void);
- 源1.c
#include "header.h"
void doSomething(void) {
global_foo = 1;
}
- main.c
#include "header.h"
int main(void) {
doSomething();
printf("%dn", global_foo);
}
printf在主函数中的输出究竟是什么?我的解释是,由于global_foo
被包含了两次,因此将有两个不同的global_foo
,因此一个这样的更改将只影响它所属文件的global_foo
。
您的评估是正确的。
因为global_foo
被声明为static
,所以每个源文件都有自己的同名不同变量,对其中一个变量的更改不会影响另一个。
因此,程序将打印-1
,因为main.c中的global_foo
没有变化。
全局变量无论如何都有static
存储持续时间,因此无需包含static
限定符来明确说明其存储持续时间。当您在翻译单元中将全局变量声明为static
时,您只是说它在该翻译单元内具有内部链接。这意味着它只能通过翻译单元中的名称来识别。
因此,如果在头文件中将一个变量声明为static
,那么包含它的每个翻译单元都会获得与其他所有单元不同的变量的自己的副本。
如果您有一个返回变量地址的函数,即
int *getStaticAddress ()
{
return &static_var;
}
您可以使用它来访问翻译单元之外的变量。