您的位置:首页 > 其它

const 和全局变量

2015-12-20 13:13 281 查看
C++中,全局变量的存储都是静态存储。但是链接性质可以有外部链接和内部链接。默认情况下是外部链接,如果在定义前加上 static ,则变为内部链接。
//file1.cpp

int val1 = 5;
extern int val2;
void fun1()
{
cout<<"fun1 :"<<endl;
cout<<"val1 :" <<val1<<" addr :"<<&val1<<endl;
cout<<"val2 :" <<val2<<" addr :"<<&val2<<endl;
}

//file2.cpp

int val2 = 10;
extern int val1;
void fun2()
{
cout<<"fun2 :"<<endl;
cout<<"val1 :" <<val1<<" addr :"<<&val1<<endl;
cout<<"val2 :" <<val2<<" addr :"<<&val2<<endl;
}

//main.cpp

extern void fun1();
extern void fun2();
int main(int, char *[])
{
fun1();
fun2();
system("pause");
return 0;
};





如果 int val1 = 5; 加上static ,则编译失败。但是如果是用const 呢。变成 const int val1 = 5;会如何呢,
答案是,也编译失败。file2.obj链接的时候找不到val1。说明const 修饰的全局变量 会跟static 修饰一样,变量具有内部链接性质。
如果我们非要让全局常量具有外部链接性质。则需要加上extern 。

extern const int val1 = 5;

在file2.cpp声明

extern const int val1;

//file1.cpp

extern const int val1 = 5;
extern const int val2;
void fun1()
{
cout<<"fun1 :"<<endl;
cout<<"val1 :" <<val1<<" addr :"<<&val1<<endl;
cout<<"val2 :" <<val2<<" addr :"<<&val2<<endl;
}

//file2.cpp

extern const int val2 = 100;
extern const int val1;
void fun2()
{
cout<<"fun2 :"<<endl;
cout<<"val1 :" <<val1<<" addr :"<<&val1<<endl;
cout<<"val2 :" <<val2<<" addr :"<<&val2<<endl;
}





如果我们的常量是定义在头文件中,头文件被多个cpp文件包含呢。新建一个header.h文件
//header.h

const int val1 = 5;
const int val2 = 100;

file1.cpp和file2.cpp分别包含header.h。





我们发现,输出的地址值是不一样的。说明每个cpp都有一份常量的定义,而不是共享一组常量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: