全局变量
用法
头文件<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对它所做的修改都不能传递给对方。