以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全局变量默认是内链接,作用域在本文件,并不是全局可见的,即局部变量