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