2010-11-21 161 views
17

默認情況下,C staticextern中的全局變量是?
如果全局變量默認爲靜態,那麼這意味着我們可以在一個文件中訪問它們,但是我們也可以在不同的文件中使用全局變量。
這是否意味着它們默認具有外部存儲?C中的全局變量是靜態的還是非靜態的?

回答

30

如果您未指定存儲類別(即,externstatic關鍵字),則默認情況下全局變量具有外部鏈接。從C99標準:

標識符

3)

§6.2.2的聯繫如果對象或功能的文件範圍標識符的聲明包含存儲類說明static,標識符有內部聯繫。

5)如果某個函數的標識符聲明沒有存儲類說明符,則它的鏈接就像使用存儲類說明符extern聲明一樣。如果對象的標識符聲明具有文件範圍並且沒有存儲類說明符,則其鏈接是外部的。

所以,即使你不指定extern關鍵字,全局仍可以通過其他源文件訪問(所謂翻譯單元),因爲他們仍然可以有一個extern聲明相同的變量。如果使用static關鍵字指定內部鏈接,則即使存在針對另一個源文件中相同變量名的extern聲明,它也會引用不同的變量。

+1

也與此有關:第6.9.2節,其中描述了暫定的定義;該節的§4明確顯示了文件範圍變量的多重定義如何相互作用 – Christoph 2010-11-21 19:51:30

+0

Thanx先生........你能解釋一下什麼是「靜態外部變量」? – Mishthi 2010-11-21 19:55:32

+0

@Mishthi:你的意思是一個既是靜態又是extern的變量?恐怕這是不可能的。 – 2010-11-21 20:01:56

6

在C,其不具有初始化或任何存儲類說明全局變量是一個變量與靜態存儲持續時間外部聯動暫定定義。

在翻譯單元中,所有暫定義和最多一個非臨時定義(例如從具有初始化符的聲明中)被摺疊爲變量的單個定義。雖然不允許在多個翻譯單元中定義相同的變量,但它是允許「公共」變量的常見擴展,即對多個翻譯單元中的相同變量的臨時定義。用C

3

全局變量是默認的extern ..(即),他們具有外部連接..

要限制外部聯動,「靜態」存儲類說明可用於全局變量..如果靜態說明符,那麼變量文件範圍。您可以不使用「的extern」關鍵字的其他文件鏈接吧..

指定「靜態」取決於你的程序的用法..