c與c++中的extern const的區別和聯繫

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

相關文章
相關標籤/搜索