如何实现跨文件全局变量共享,使函数间的修改相互可见?
如何实现跨文件全局变量共享,使函数间的修改相互可见?
兄弟,我看了你的代码,问题出在你没真正创建共享的全局变量,反而在每个函数里都定义了自己的局部a,自然修改不会互相影响啦!咱们一步步来解决这个问题。
先分析你当前代码的核心问题
- 你的
global_var.h里只写了extern int a;,这只是一个声明——告诉编译器“有个叫a的int变量存在,但它不是在这儿定义的”,但你从来没在任何.cpp文件里定义这个全局变量(也就是实际分配内存的那一步)。 - 然后
fun()里的int a = 10;是定义了一个局部变量a,它和你extern声明的全局a完全是两个东西,所以这里修改的只是fun函数自己的局部变量,和main里的a没关系。 - 同样,
main()里的int a;也是一个局部变量,和全局a不沾边,你看到的0其实是未初始化局部变量的随机值(只是恰好输出0而已,这属于C++里的未定义行为)。
正确实现跨文件全局变量共享的步骤
要让变量在多个文件间共享并互相可见修改,关键要区分声明和定义:
- 声明:用
extern关键字写在头文件里,告诉所有包含该头文件的代码“这个变量在别处定义了,你们可以用它”。 - 定义:在某个.cpp文件里(不能在头文件里,否则多文件包含会重复定义)写变量声明(比如
int a;),这才是真正创建全局变量、分配内存的地方。
1. 修改你的现有代码(实现你想要的输出)
我们调整一下你的文件结构:
global_var.h(保持声明不变)
extern int a; void fun();
新增global_var.cpp(定义全局变量)
#include "global_var.h" // 这里定义全局变量a,所有文件共享这个实例 int a;
fun.cpp(去掉局部变量a的定义)
#include <iostream> #include "global_var.h" void fun() { // 直接使用全局变量a,不再定义局部a a = 10; std::cout << "Print out in fun() " << a << std::endl; }
main.cpp(去掉局部变量a的定义)
#include <iostream> #include "global_var.h" int main() { fun(); // 这里使用的是被fun()修改后的全局变量a std::cout << "Print out in main: " << a << std::endl; return 0; }
修改Makefile(新增global_var.o依赖)
ALL = main.o fun.o global_var.o Target = main CC = g++ $(Target): $(ALL) $(CC) -o $(Target) $(ALL) clean: rm *.o $(Target)
现在编译运行,输出就会和你期望的一致:
Print out in fun() 10 Print out in main: 10
按照你想要的多函数扩展结构实现
如果要扩展成多个函数文件共享全局变量的结构,参考下面的模板:
global_var.h(声明所有共享变量和函数)
// 声明全局变量 extern int shared_a; extern double shared_b; // 声明各个模块的函数 void func1(); void func2();
global_var.cpp(定义全局变量)
#include "global_var.h" // 定义全局变量,可初始化默认值 int shared_a = 0; double shared_b = 3.14;
func1.h(暴露func1的接口,可选)
void func1();
func1.cpp(使用并修改全局变量)
#include <iostream> #include "global_var.h" void func1() { shared_a = 100; std::cout << "func1 modified shared_a to: " << shared_a << std::endl; }
func2.h(暴露func2的接口,可选)
void func2();
func2.cpp(使用并修改全局变量)
#include <iostream> #include "global_var.h" void func2() { shared_b = 6.28; std::cout << "func2 modified shared_b to: " << shared_b << std::endl; }
main.cpp(调用函数,查看全局变量的修改)
#include <iostream> #include "global_var.h" int main() { std::cout << "Initial shared_a: " << shared_a << std::endl; std::cout << "Initial shared_b: " << shared_b << std::endl; func1(); func2(); std::cout << "After func1 and func2, shared_a: " << shared_a << std::endl; std::cout << "After func1 and func2, shared_b: " << shared_b << std::endl; return 0; }
对应的Makefile也要包含所有目标文件:
ALL = main.o func1.o func2.o global_var.o Target = main CC = g++ $(Target): $(ALL) $(CC) -o $(Target) $(ALL) clean: rm *.o $(Target)
这样所有函数都能共享并修改同一个全局变量,修改后的值在main里也能实时看到啦!
备注:内容来源于stack exchange,提问作者pvasbob
相关产品推荐
相关产品推荐

