2017-02-21 59 views
-5

當我們聲明的任何全局變量,比如爲什麼C中全局變量的存儲類被隱式定義爲「extern」?

int x; 

它相當於

extern int x; 

現在默認的全局變量是由編譯器,這意味着它們分配的內存初始化爲0。但如果我只是寫

extern int x; 

然後這將只聲明變量,而沒有內存將分配給它。所以,我的問題是,如果我在int x之前寫extern或者我不寫,如果全局變量爲,編譯器如何區別對待它們?在我簡單地寫int x的情況下,它分配內存,同時它將extern放在int x之前,而在我編寫extern int x的情況下,它只聲明變量而不分配內存。請說明編譯器如何在兩種方式下行爲。

+1

'int x;'不等同於'extern int x;'(您似乎在最後一段中承認這一點) –

+0

問題是您爲什麼認爲全局變量被聲明爲'extern'? –

回答

1

這可以通過了解外部對象定義和Tentative definition來解答。

引用C11,章§6.9.2,(重點煤礦

對於具有文件範圍沒有初始化的對象的標識符的聲明,和 沒有存儲類說明或存儲級說明符static,構成 暫定義。如果翻譯單元包含 標識符和的一個或多個暫定義,則翻譯單元不包含該標識符的外部定義,則 的行爲與翻譯單元包含該 標識符的文件範圍聲明完全相同,其中複合類型作爲翻譯單元的端部,具有一個初始化 等於0

+1

我徘徊爲什麼人們仍然會忽視標準應至少讀一次的事實。 – Michi

+0

@Michi同意。很多時候,標準文本看起來有點棘手,但經過仔細研究,這纔是真正回答大部分問題的權威來源。 –

6

您的問題的非常前提是不正確。此

int x; 

是一個暫定定義(這將是由翻譯單元的端部變成的x正常定義)。

extern int x; 

是一個非限定聲明,這不是一個定義的。

它們甚至不是等效的。

您的原始定義的鬆散相當於將

extern int x = 0; 

這是一個定義。但這不完全相同,因爲這個定義不是暫定的。

關鍵字extern如果(且僅當)沒有明確的初始值設定項,則將對象定義轉換爲非定義聲明。如果存在明確的初始值設定項,則即使向其中添加了extern,定義仍然是一個定義。

相關問題