2014-10-10 69 views
1

頁的有關跨文件共享常數變量,像這樣C++入門第五版會談60使用extern在文件間共享const時,爲什麼extern需要定義?

//file_1.cc 
extern const int bufSize = fcn(); 

//file_1.h 
extern const int bufSize; 

當將BUFSIZE定義,什麼是對file_1.cc的extern的目的是什麼?我知道file_1.cc會定義它,但是同一本書的第45頁說,爲變量提供一個初始化器覆蓋了extern,那麼爲什麼在const的定義中必須有extern?

+1

與C不同,C++中的const默認爲內部鏈接,在這種情況下,就好像它已被聲明爲靜態一樣。 extern被要求覆蓋這個。 – 2014-10-10 01:13:03

+0

因此,extern會將變量更改爲外部鏈接,從而允許跨文件共享該變量? – Matt 2014-10-10 01:16:14

+0

是的。另一種方法是僅在不帶外部頭的情況下聲明const。對於一個簡單的const(不是一個類)給定一個文字(例如'const int size = 5;'),這很好。但是,如果頭文件中的常量是從函數初始化的,則將爲包含頭文件的每個源文件再次調用該函數,效率低下。 – 2014-10-10 01:18:05

回答

2

根據標準,

具有名稱命名空間範圍(3.3.6)具有如果是的名稱...被顯式聲明的非易失性可變內部聯動constconstexpr和既沒有明確宣佈 extern也沒有先前聲明有外部鏈接

因此,有一個特殊的規則,在命名空間內的變量有內部鏈接時constconstexpr,即使他們會加時賽herwise有外部聯繫。我不完全確定爲什麼這個規則存在,但我懷疑是允許編譯器嵌入const變量,因此根本沒有爲它們分配任何存儲。 extern說明符明確地覆蓋了這一點,並使該變量再次具有外部鏈接。

提供用於變量的初始值設定將覆蓋的extern

現在,這是有點不同。默認情況下,變量的聲明也是一個定義,但extern取消了這個定義,因此您可以聲明一個變量而不定義它(即,因爲它的定義位於另一個翻譯單元中)。但是,如果你有一個初始化器,那麼它將覆蓋extern,並且聲明再次成爲一個定義。這與上面關於內部和外部鏈接的規則沒有真正的關係。

相關問題