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

问题描述 投票:1回答:1

当了解到 externstatic 在CC++中的变量,我遇到了这个 回答.

也许我错过了什么,但这个答案让我对我的一段代码产生了疑问。

假设我有以下文件。

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

主函数中的printf的输出到底是什么?我的解释是,由于 global_foo 包括两次,将有两个不同的 global_foo因此,一个这样的变化将只影响到 "我"。global_foo 的文件。

c static extern
1个回答
4
投票

你的评估是正确的。

因为 global_foo 被宣布为 static每一个源文件都有自己独特的同名变量,改变一个变量不会影响另一个变量。

正因为如此,程序将打印 -1,因为 global_foo main.c中的变量没有变化。


2
投票

全局变量有 static 的存储时间,所以没有必要在其中加入 static 修饰符来明确说明它的存储持续时间。当您将一个全局变量声明为 static 在一个翻译单元内,您只是说它在该翻译单元内有内部联系。这意味着它只能通过翻译单元中的名称来识别。

所以,如果您将一个变量声明为 static 在头文件中,每个包含它的翻译单元都会得到自己的变量副本,这个副本与其他所有的变量不同。

如果您有一个返回变量地址的函数,即:"变量"。

int *getStaticAddress () 
{
    return &static_var; 
}

你可以用它来访问翻译单元之外的变量。

© www.soinside.com 2019 - 2024. All rights reserved.