全局变量、static全局变量、全局常量使用方法

来源:互联网 发布:小怪兽 知乎 编辑:程序博客网 时间:2024/06/08 11:26

以vc/vs开发的应用程序为例

1.全局变量

全局变量的使用条件是,要加入全局变量的位置除了.h文件,还必须有.cpp文件,添加格式如下:

.h文件中添加:

extern int g_nvalue;

.cpp文件中添加:

int g_nvalue = 9;

使用时:

#include "头文件"extern int g_nvalue;


实际c++代码经常有下面几种情况,第一种是公共位置.h和.cpp文件都有的,如vc/vs开发的程序,包含stdatx.h和stdafx.cpp,在这两个文件里按照上述方式添加即可;第

二种是公共位置是用户自己定义的只含有.h文件,这种情况只能自己手动添加.cpp文件;还有一种是只含有.cpp文件的,如纯c/c++代码的main.cpp文件,这种情况全局变量就不能定义在main.cpp里,需要在其他文件添加即可


错误情况(以vc/vs开发为例):

在stdafx.h中添加

int g_nvalue = 9;

然后把它当做全局变量使用,没有使用的使用,编译能够正常编过,但是有任何位置使用它,不管使用的地方有没有加extern int g_nvalue,你会发现编译都会报错“重定义“,即使定义全局变量的地方加了防止头文件重复的宏,结果也是这样,因为公共头文件已经被很多文件包含了

当然网上有人说在声明的地方改为extern int g_nvalue=9,使用的地方不使用#include包含头文件,只加入extern int g_nvalue,但是这样公共头文件中其他内容就使用不了了,所以也不行


2.static全局变量

static全局变量的作用域是定义的源文件,只被初始化一次,使用格式如下:

在使用的.cpp文件中加入:

static int g_snValue = 9;

由于它只定义的文件中起作用,所以使用也只能在定义的.cpp文件中


错误情况:

a.h中static int g_snValue = 9;

a.cpp中#include "a.h"void fun(){     g_snValue = 8;     cout <<&g_snValue << " " <<g_snValue <<endl;}

b.cpp中#include "a.h"void fun2(){   cout <<&g_snValue << " " <<g_snValue <<endl;}

int _tmain(int argc, _TCHAR* argv[]){fun();        fun2();system("pause");return 0;}


输出结果不一样,原因:static全局变量定义在.h中,通过.cpp访问的是该值的拷贝,即会单独分配一块内存,并将该值拷贝一份,.cpp中所做的任何更改都不会对原值造成任何影响,所以static全局变量一般定义在.cpp中,防止造成信息污染,任何外部想访问值的内容,可以通过在.h中添加新的函数,获取.cpp的静态值的内容即可


3.全局常量
const单独使用时,其特性与static一样(每个编译单元中地址都不一样,不过因为是常量,也不能修改,所以就没有多大关系)