在多个源文件中共享的全局静态变量

Global static variables shared in multiple source files

在学习 C/C++ 中的 externstatic 变量时,我遇到了这个 answer

也许我遗漏了一些要点,但这个答案引起了对我的代码的怀疑。

假设我有以下文件:

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);
}

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; 
}

您可以使用它来访问翻译单元外部的变量。