const 和全局变量

这篇博客探讨了C++中const修饰的全局变量的行为。当全局变量使用const修饰时,它们会像static变量一样具有内部链接性质,导致编译错误。为使const全局变量具有外部链接,需要使用extern关键字显式声明。当const全局变量定义在头文件并被多个源文件包含时,每个源文件都会有一份常量的副本,而不是共享同一内存位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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都有一份常量的定义,而不是共享一组常量。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值