首页 > 编程语言 > 详细

c++中, const变量默认仅在当前文件内有效

时间:2021-04-05 21:28:21      阅读:22      评论:0      收藏:0      [点我收藏+]

以前从来没有注意到的一个知识点: const 修饰的对象默认只有当前文件中有效。这就表明了:

  1. 在不同的.cpp文件内可以定义相同名称的const 对象。
  2. 如果要使const 我修饰的变量具有全局使用域,在定义该变量时,需要加上extern 关键字。

定义const变量时,不使用extern的情况:

在1.cpp文件中,定义如下:

const int a = 100;

在2.cpp文件中,定义如下:

extern const int a;
int main() {
	cout << a << endl;
	return 0;
}

我们进行编译, 会报链接错误,原因是:在2.cpp文件找不到变量a的定义。
技术分享图片

定义const 变量时, 使用extern 关键字的情况:

在1.cpp文件中,定义如下:

extern const int a = 100;

在2.cpp文件中,定义如下:

extern const int a;
int main() {
	cout << a << endl;
	return 0;
}

编译正常,代码运行正常:

技术分享图片

进一步分析原因

我猜测当定义一个const变量时,使用与不使用extern关键字时,生成的变量的符号不相同。下面进行验证。

  • 第一步:新建一个1.cpp文件,定义如下:

    const int value1 = 100;
    extern const int value2 = 100;
    int value3 = 100;
    extern int value4 = 100;
    
  • 第二步, 编译成.o文件。(报了一个编译警告,不管它)

技术分享图片

  • 第三步:使用readelf工具看一下.o文件的符号表

技术分享图片

我们看到:当定义一个const变量时,如果不使用extern 关键字进行修饰,默认生成的变量的符号为local 属性,而使用extern 关键字时,生成的符号为global属性。 对应local属性的符号,在链接的时候是找不到的。所以,const 对象默认只在文件内有效。

c++中, const变量默认仅在当前文件内有效

原文:https://www.cnblogs.com/yinheyi/p/14619182.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!