在多个源文件中共享的全局静态变量
在多个源文件中共享的全局静态变量
在学习C/C++中的extern
和static
变量时,我遇到了这个答案。也许我漏掉了一些要点,但这个答案对我的代码提出了疑问。\n假设我有以下文件:\n
- \n
- header.h
\n
\n
static int global_foo = -1; void doSomething(void);
\n
- \n
- source1.c
\n
\n
#include "header.h" void doSomething(void) { global_foo = 1; }
\n
- \n
- main.c
\n
\n
#include "header.h" int main(void) { doSomething(); printf("%d\n", global_foo); }
\n在主函数的printf输出中,究竟是什么?我的理解是,由于global_foo
被包含了两次,会有两个不同的global_foo
,因此这样的改变只会影响它所属的文件的global_foo
。
全局静态变量在多个源文件中共享的问题是由于在头文件中声明了静态变量导致的。静态变量已经具有静态存储期,所以没有必要使用static限定符来显式地说明它的存储期。当你在一个翻译单元中将全局变量声明为静态时,你只是在说它在该翻译单元中具有内部链接。这意味着它只能在翻译单元内通过其名称标识。
因此,如果你在一个头文件中将变量声明为静态,那么包含它的每个翻译单元都会有自己的变量副本,这与其他所有翻译单元都不同。
如果你有一个返回变量地址的函数,例如:
int *getStaticAddress() { return &static_var; }
你可以使用它在翻译单元之外访问该变量。
解决这个问题的方法是将静态变量的声明放在一个源文件中,然后在其他源文件中使用extern关键字来声明该变量。这样可以确保所有源文件共享同一个变量。
例如,在一个源文件中定义静态变量:
static int static_var;
然后在其他源文件中使用extern来声明它:
extern int static_var;
这样就可以在多个源文件中共享同一个静态变量了。
全局静态变量在多个源文件中共享的问题是由于变量声明为静态(static)导致的。当一个变量被声明为静态时,每个源文件都会有自己独立的同名变量,而对一个变量的修改不会影响其他文件中的同名变量。
在这个例子中,由于global_foo
在main.c中没有被修改,所以程序会输出-1
。
要解决这个问题,可以将global_foo
的声明放在一个头文件中,并在每个源文件中包含这个头文件。这样,在编译时,每个源文件都会使用同一个全局变量,而不是创建各自独立的变量。
以下是解决方法的示例代码:
// global_vars.h
#ifndef GLOBAL_VARS_H
#define GLOBAL_VARS_H
extern int global_foo;
#endif
// main.c
#include "global_vars.h"
#include
int global_foo = -1;
int main() {
printf("%d\n", global_foo);
return 0;
}
// other.c
#include "global_vars.h"
void change_global() {
global_foo = 42;
}
在这个示例中,我们将global_foo
的声明移动到了global_vars.h
头文件中,并使用extern
关键字表示这是一个外部变量。然后,我们在每个源文件中包含这个头文件。
在main.c中,我们初始化了global_foo
的值为-1
,并输出它的值。在other.c中,我们定义了一个函数change_global
,用于修改global_foo
的值为42
。
现在,编译并运行这个程序,它会输出42
,因为global_foo
是全局共享的,而不是每个源文件都有自己的独立变量。