C++ extern 关键字 声明变量为全局变量,多文件共享变量

来源:互联网 发布:mcs51单片机是几位 编辑:程序博客网 时间:2024/06/01 09:50

extern 关键字声明多文件共享变量

我们在C++开发中经常会遇到一些场景需要多个cpp文件同时共享一个变量,这个时候有两种选择,1、使用static 关键字;2、使用extern 关键字,而本文着重讲的便是extern 关键字
如何才能共享呢?下面我举一个简单的例子来说明。
我们把所有要共享的变量写在一个globalVar.h文件里面,然后在globalVar.cpp中定义这个变量。这样如果a.cpp或者b.cpp要引用全局变量,只需直接#include”globalVar.h”即可。

//以共享结构体与共享普通变量为例子//       globalVar.h#include<string>struct globalStruct{    int m_iX;    int m_iY;    std::string m_sZ;};extern int globalShareInt;extern globalStruct* globalShareStruct;//这里是声明globalShareStruct这个指针变量,是什么类型的变量都是ok的
//              globalVar.cpp//这个文件是用来将我们刚才在globalVar.h声明的变量定义#include "globalVar.h"int globalShareInt=0;//变量定义 globalStruct* globalShareStruct = new globalStruct ();//变量定义
//使用这个多文件共享的变量 引用头文件即可//          a.cpp#include "globalVar.h"bool testFunction(){    globalShareStruct->m_iX = 1000;    globalShareInt = 1000;    return globalShareInt;}
//使用这个多文件共享的变量 引用头文件即可//          b.cpp#include "globalVar.h"bool testFunction(){    globalShareStruct->m_iX = -1000;    globalShareInt = -1000;    return globalShareInt;}

现在两个文件就是共享一个变量了,如果a.cpp中函数先执行,则globalShareInt 这个变量的值为1000;
如果是b.cpp中函数先执行,则globalShareInt 这个变量的值为 -1000;
如此以来就实现变量的多文件共享。


下面我们来讲一些关于变量声明与变量定义的区别:
而讲这个之前,我们要有一些基本的编译原理的知识

1、源代码经过编译之后会生成ELF文件格式(Linux), PE/COFF文件格式(Windows)的可执行文件,linux下为(a.out),Windows下为(*.exe)
2、在这些可执行文件中,以exe文件为例,会有很多个段(segment),最主要的有 text段, data段,bss段等
3、text段可以理解源代码经过编译生成汇编指令代码存在text段里面,供后面机器的pc(程序计数器)读取
4、data段是用来存放已经初始化的全局变量和初始化的静态变量
5、bss段是用来存放未初始化的全局变量与未初始化的静态变量

我们这里要讲的就是全局变量,局部变量一般都是存放在栈(stack)中的。

C++中变量的声明与定义

int a;//变量定义int a = 10;//变量定义extern int a;//变量声明
+   声明的变量(没有初始化而且有extern关键字)经过编译后是存储在bss段中的,而在这个段中的变+   量是没有申请内存,它只是记录了它需要多少内存空间,也就是说它本身需要 4 个字节的内存空间,+   但是它在bss段中只用了 1个字节来记录信息。那你可能会问那要是要用它怎么办呢?这个问题我们+   不用关心,因为这个是编译器该解决的问题。我们只需要知道它存储在bss段,而且没有申请内存,+   只是在bss段记录信息---这个便是变量的声明。


+   变量的定义,如上面所示,全局的变量的定义,经过编译之后是存放在data段的,这个段是已经为每+   一个变量有申请好了特定的内存空间,申请好了的内存空间我们就可以认为它是定义的变量

我们一开始学习C++的时候很容易将变量的声明与变量的定义弄混淆,所以希望本文能给读者分清变量的声明与定义的区别,如果还是看不懂,个人建议可以参考一下函数的声明与定义去理解变量的声明与定义。

extern关键字还有其他的一些用法,具体大家可以参考下面这一篇文章
C 语言中 extern 关键字详解

文章若有误差出错,欢迎大家批评指正!