头文件中定义的全局变量。其他函数调用可以看到它的变化

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

我有一个 .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文件。这里的函数调用可以看到对其他函数调用引入的变量的修改。

谢谢!

c++ variables global share
1个回答
0
投票

您还没有定义全局变量。您已声明一个,然后在两个不同的位置定义了具有相同名称的局部变量。注意:你的程序有未定义的行为,因为你使用了

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

但是,我对全局可变状态的建议是:不要。随着程序规模的增大,您会发现越来越难推理任何单独部分的功能,因为您无法跟踪它读取和写入的状态。

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