最近複習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對象寫入符號表: