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;
};
![](file:///C:/Users/Administrator/AppData/Local/YNote/data/15817345963@163.com/95e3ac6d8ce94f35bb63a66b0e85b8f0/clipboard.png)
![](http://img.blog.csdn.net/20151220131241535?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如果 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;
}
![](file:///C:/Users/Administrator/AppData/Local/YNote/data/15817345963@163.com/648f43b4ca24415e89f649ee702d4b5a/clipboard.png)
![](http://img.blog.csdn.net/20151220131250611?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如果我们的常量是定义在头文件中,头文件被多个cpp文件包含呢。新建一个header.h文件
//header.h
const int val1 = 5;
const int val2 = 100;
file1.cpp和file2.cpp分别包含header.h。
![](http://img.blog.csdn.net/20151220131256953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](file:///C:/Users/Administrator/AppData/Local/YNote/data/15817345963@163.com/11cfad50307f4775b0ea9eb5a90b164b/clipboard.png)
我们发现,输出的地址值是不一样的。说明每个cpp都有一份常量的定义,而不是共享一组常量。
//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;
};
![](file:///C:/Users/Administrator/AppData/Local/YNote/data/15817345963@163.com/95e3ac6d8ce94f35bb63a66b0e85b8f0/clipboard.png)
如果 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;
}
![](file:///C:/Users/Administrator/AppData/Local/YNote/data/15817345963@163.com/648f43b4ca24415e89f649ee702d4b5a/clipboard.png)
如果我们的常量是定义在头文件中,头文件被多个cpp文件包含呢。新建一个header.h文件
//header.h
const int val1 = 5;
const int val2 = 100;
file1.cpp和file2.cpp分别包含header.h。
![](file:///C:/Users/Administrator/AppData/Local/YNote/data/15817345963@163.com/11cfad50307f4775b0ea9eb5a90b164b/clipboard.png)
我们发现,输出的地址值是不一样的。说明每个cpp都有一份常量的定义,而不是共享一组常量。
相关文章推荐
- SVM分类器进行HOG行人检测
- 让NexusPHP支持更多缓存
- android中sharedPreferences的用法
- 编译Caffe时发生错误LINK : fatal error LNK1104: 无法打开文件“opencv_contrib300d.lib”
- 卡特兰数及其应用
- 批处理学习总结
- for循环与for in,$('').each 与$.each的区别
- sea wordpress 无法上传图片
- IIS+PHP偶尔出现500
- CENTOS里面的配置163 mail 系统
- Android传感器学习之加速度传感器数据获取
- 开发中的错误的总结
- 写星级评价的控件,以及自定义的lable控件
- 使用PHP,实现查询天府通余额
- 第2章 活动的启动模式
- jvm 中的 ”永生代“
- Android中ListView的优化
- 20135203齐岳 信息安全系统设计基础期末总结
- 基本磁盘转换动态磁盘,再转换为基本磁盘,分区数据丢失
- Unbearable Controversy of Being