我有一个 .h 文件和两个 .cpp 文件:
global_var.h fun.cpp main.cpp
详情如下:
global_var.h:
extern int a;
void fun();
有趣的.cpp
#include <iostream>
#include "global_var.h"
void fun()
{
int a = 10;
std::cout << "Print out in fun() " << a << std::endl;
}
主.cpp
#include <iostream>
#include "global_var.h"
int main()
{
int a;
fun();
std::cout << "Print out in main: " << a << std::endl;
return 0;
}
还有一个 makefile:
ALL = main.o fun.o
Target = main
CC = g++
$(Target): $(ALL)
$(CC) -o $(Target) $(ALL)
clean:
rm *.o
代码的输出是:
Print out in fun() 10
Print out in main: 0
在main函数中,调用fun()将a修改为10,然后在main中再次打印出a。我认为 fun() 对 a 的更改也可以在 main 中看到,所以我期望的输出是:
Print out in fun() 10
Print out in main: 10
知道如何实现这一目标吗?
我的最终目标是拥有如下结构:
global_var.h
// 定义(或声明。如果我使用了错误的术语,请纠正我)要共享给下面定义的所有函数的所有变量。
func1.h func1.cpp
// 包含global_var.h,定义func1,可以使用或修改global_var.h中的变量
func2.h func2.cpp
// 包含global_var.h,定义func2,可以使用或修改global_var.h中的变量
......
主.cpp
//包含上面所有的.h文件。这里的函数调用可以看到对其他函数调用引入的变量的修改。
谢谢!
您还没有定义全局变量。您已声明一个,然后在两个不同的位置定义了具有相同名称的局部变量。注意:你的程序有未定义的行为,因为你使用了
main
的 a
的值而没有初始化它。
您是想这样做吗?
有趣的.cpp
#include <iostream>
#include "global_var.h"
int a;
void fun()
{
a = 10;
std::cout << "Print out in fun() " << a << std::endl;
}
主.cpp
#include <iostream>
#include "global_var.h"
int main()
{
fun();
std::cout << "Print out in main: " << a << std::endl;
return 0;
}
但是,我对全局可变状态的建议是:不要。随着程序规模的增大,您会发现越来越难推理任何单独部分的功能,因为您无法跟踪它读取和写入的状态。