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

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

1.全局变量

全局变量的使用条件是,在.cpp文件中定义并初始化,添加格式如下:

.cpp文件中添加:

int g_nvalue = 9;


使用时,并不需要添加什么头文件,直接在要使用全局变量的.cpp中声明:

extern int g_nvalue;

然后就可以使用了

那么为什么不需要头文件直接声明就可以使用了呢?

原理:c/c++首先编译生成.obj文件,然后所有的.obj文件链接生成可执行文件,对于全局变量而言,虽然定义时在不同的文件中,但是链接时它们是全局可见的

 

特殊类型:const全局变量

const在c中默认是外链接,而在c++中默认是内链接

意思是:在c中const定义的就是全局变量,按照上面的方式进行定义和声明即可使用,但是在c++中const默认是内链接,即在全局内定义的const全局变量默认是内链接,作用域在本文件,并不是全局可见的,即局部变量,类似于staic的作用范围

如:在.cpp中定义:

const int g_nvalue = 9;

那么在另一个.cpp中使用它,这样声明:

extern const int g_nvalue;

编译时出错:提示找不到g_navalue

那么如何解决呢?

方法1:c++定义的const全局变量作用域既然域static一样,那么可以采用添加.h文件的方法,如:

添加global.h文件,里面添加:

extern const int g_nvalue;

然后原来的定义const全局变量的.cpp中添加global.h,在要使用这个变量的.cpp中添加global.h,这样就可以使用const变量了

实用例子:c++项目经常使用定义使用const全局变量的使用例子:

.h中:

namespace hello {
extern const char kaa[];
extern const char kbb[];                        
extern const char kcc[];                        
extern const char kdd[];       

}

.cpp中添加:

namespace hello {
const char kaa[] = "aa";
const char kbb[] = "bb";
const char kcc[] = "cc";
const char kdd[] = "dd";

}

使用时直接添加.h文件即可使用

方法2:通过添加extern使const全局变量强制外链接

.cpp中定义时同时添加extern:

extern const int g_nvalue = 9;

使用它的.cpp中声明:

extern const int g_nvalue;

然后就可以使用了

说明:只有.cpp没有.h的情况是c/c++代码的main.cpp文件

 

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

在stdafx.h中添加

int g_nvalue = 9;

 

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

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

 

任务例子:

已知一个main.cpp中定义了如下,并且该main.cpp没有头文件:

HINSTANCE g_hInstance;
const char kExit[] = "exit";

现在另一个工程要使用这个main.cpp中的这两个变量,如何实现?

答案:

第一步:把main.cpp添加到工程中

第二步:...(自行解决哈哈)

 

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

2)在c++中const默认是内链接,即在全局内定义的const全局变量默认是内链接,作用域在本文件,并不是全局可见的,即局部变量

 
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值