最近复习c++,发现了这个东西。c++
c语言里面,咱们在一个.c文件中用const定义了一个全局变量后,能够在另外一个.c文件中用extern const来引用,但在c++中在连接的时候会报undefined reference错误,这是由于在c语言里面,const全局变量在符号表里面是GLOBAL即全局可见的,而在c++里面倒是LOCAL即只能在当前编译模块可见。spa
e.g.code
在a.h中:对象
1 extern const int a;
在a.c中:blog
1 const int a = 10;
在main.c中:编译器
1 #include<stdio.h> 2 #include"a.h" 3 4 int main() 5 { 6 printf("%d\n",a); 7 }
gcc a.c main.c -o mainio
编译成功,输入./main输出10编译
咱们使用gcc -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:class
能够看到最后一行,a在符号表中是GLOBAL的。变量
接下,咱们不用改动代码,只是使用g++ a.c main.c -o main来编译程序,能够看到出错:
连接出错,缘由是找不到a的定义,
使用g++ -c a.c -o a.o生成a.o,再使用readelf -s a.o查看符号表:
Num为6的那行代表,a变成了一个LOCAL对象,只能在a.o中可见,对main.o不可见。
解决方法:
将a.c 中的
1 const int a = 10;
改成:
1 extern const int a = 10;
这样g++编译器在第一次看到a的定义的时候,由于存在extern关键字,就把它当成GLOBAL对象写入符号表: