全局变量与静态全局变量

全局变量

用法

头文件<globalVar.h>声明

extern 关键字: 它的作用是声明函数或变量的作用范围的关键字,其声明的函数和变量可以在本编译单元或其他编译单元中使用。即B编译单元要引用A编译单元中定义的全局变量或函数时,B编译单元只要包含A编译单元的头文件即可,在编译阶段,B编译单元虽然找不到该函数或变量,但它不会报错,它会在链接时从A编译单元生成的目标代码中找到此函数。

    #include <string>
    using namespace std;
    extern string globalVar;

源文件 <globalVar.cpp>定义

    #include "globalVar.h"

    string globalVar = "Test global var";

main文件<main.cpp>使用

    #include "globalVar.h"
    #include <iostream>
    int main()
    {
	    cout << globalVar << endl;
    }

错误用法

声明和定义都写在头文件<globalVar.h>中

    #include <string>
    using namespace std;
    extern string globalVar = "Test global var";

编译报错

globalVar.cpp
1>main.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > globalVar" (?globalVar@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A) already defined in globalVar.obj
1>D:\work\opensource\visualstudio\algorithm\x64\Debug\learn.exe : fatal error LNK1169: one or more multiply defined symbols found

静态全局变量

用法

在声明处初始化 <globalVar.h>

  #include <iostream>
  #include <string>
  using namespace std;
  static string globalVar = "Test static global var";
  void func1();

源文件使用 <globalVar.cpp>

    #include "globalVar.h"
    void func1()
    {
        globalVar = "static global var in func1";
        cout << globalVar << " " << &globalVar << endl;
    }

main文件使用 <main.cpp>

    #include "globalVar.h"
    #include <iostream>
    void func2()
    {
        globalVar = "static global var in func2";
        cout << globalVar <<" "<< &globalVar << endl;
    }
    void main()
    {
        func2();
        func1();
        cout << globalVar << " " << &globalVar << endl;
    }

运行结果:

    static global var in func2 00007FF75B0654F0
    static global var in func1 00007FF75B0654C0
    static global var in func2 00007FF75B0654F0

可以看出:

多个源文件引用静态全局变量所在的头文件,不会出现重定义错误。func1和func2中的globalVar是两个不同的变量,两者之间互不影响。 static修饰的全局变量的作用域只能是本身的编译单元。在其他编译单元使用它时,只是简单的把其值复制过来,在其他编译单元对它的修改并不影响本身在定义时的值。即在其他编译单元A使用它时,它所在的物理地址,和其他编译单元B使用它时,它所在的物理地址不一样,A和B对它所做的修改都不能传递给对方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值