以前从来没有注意到的一个知识点: const 修饰的对象默认只有当前文件中有效。这就表明了:
- 在不同的.cpp文件内可以定义相同名称的const 对象。
- 如果要使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 对象默认只在文件内有效。