以前从来没有注意到的一个知识点: const 修饰的对象默认只有当前文件中有效。这就表明了:
在1.cpp文件中,定义如下:
const int a = 100;
在2.cpp文件中,定义如下:
extern const int a;
int main() {
cout << a << endl;
return 0;
}
我们进行编译, 会报链接错误,原因是:在2.cpp文件找不到变量a的定义。
在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文件。(报了一个编译警告,不管它)
我们看到:当定义一个const变量时,如果不使用extern 关键字进行修饰,默认生成的变量的符号为local 属性,而使用extern 关键字时,生成的符号为global属性。 对应local属性的符号,在链接的时候是找不到的。所以,const 对象默认只在文件内有效。
原文:https://www.cnblogs.com/yinheyi/p/14619182.html