C++中设置全局变量的几种方法

时间:2022-11-05 10:27:46

 

一、了解必要的知识

 

1. 编译单元(模块):
    在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的话,那么你可能非常的理解编译与连接的区别!当在VC这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,VC其实做了两步工作,第一步,将每个.cpp(.c)和相应.h文件编译成obj文件;第二步,将工程中所有的obj文件进行LINK生成最终的.exe文件,那么错误就有可能在两个地方产生,一个是编译时的错误,这个主要是语法错误,另一个是连接错误,主要是重复定义变量等。我们所说的编译单元就是指在编译阶段生成的每个obj文件,一个obj文件就是一个编译单元,也就是说一个cpp(.c)和它相应的.h文件共同组成了一个编译单元,一个工程由很多个编译单元组成,每个obj文件里包含了变量存储的相对地址等 。

2. 声明与定义的区别
    函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过, 但是当函数或变量定义的时候,它就在内存中有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个工程中任何一个地方定义的话, 那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量!你也可以这样理解, 对同一个变量或函数的声明可以有多次,而定义只能有一次!

 

以上内容来自:http://dev.firnow.com/course/3_program/c++/cppjs/20091211/184622.html

 

 

二、定义全局变量的方法:

1、采用包含头文件的方法

 

 

 

 

整个程序的代码如上所示,首先在"globalVal.h"文件中用关键字extern声明了num和r两个全局变量,表示在两个变量是在别的文件中定义的,在"fun1.cpp"中,定义了num和r两个变量。而在"fun2.cpp"中通过"#inlcude globalVal.h"声明了全局变量num和r,这样在"fun2.cpp"中就可以使用全局变量num和r了。整个程序的编译和链接过程如下:globalVal.h和fun1.cpp编译生成了fun1.obj文件,并且定义了num和r,即为globalVal.h中声明的num和r分配了存储空间;global.h和fun2.h编译生成了fun2.obj,但是并没有定义num和r,只是通过global.h的extern声明可以使用fun1.obj中的num罢了。

   如果,我们在global.h中声明并且定义了num和r,那么在编译过程中就对num和r各进行了两次定义,这样在链接过程中就造成了重复定义的的错误。如果把fun1.cpp中的定义删除,那么就会出现“全局变量未定义的错误”,全局变量最好在头文件中声明,在源文件中定义,定义必须要有,而且只能定义一次;

 

2、通过extern声明

 

 只要在我们使用全局变量的源文件中加入extern num 和extern r 就行。