2016-10-04 110 views
1

我在讀TLDP,注意到所有的全局變量和函數都聲明爲靜態的。在進一步閱讀之後,我瞭解到變量聲明爲靜態,以減少名稱空間污染的爲什麼linux內核中的全局變量是靜態的?

根據this SO後,

靜態函數是隻對在同一個文件(更準確地說是相同的翻譯單元)等 功能可見功能。

因此,將函數聲明爲靜態將減少名稱空間污染。但是,在變量的情況下,根據TLDP

當一個靜態變量是由模塊修改,所有其他模塊將 看到新的值。

這會增加命名空間污染。不是全局靜態變量對同一個翻譯單元也是可見的嗎?如果是這樣,以上引用的聲明如何是真的?我似乎錯過了一些東西。

回答

2

當一個靜態變量由模塊

我相信你可能會誤以爲一句修改。它可能有點混亂。它不是指C static關鍵字。它是指C標準對「靜態存儲時間」的使用。參考C標準的第6.2.4節:

1一個對象有一個存儲時間來決定它的生命週期。有 是三個存儲持續時間:靜態,自動和分配。

....

3其標識符被聲明與外部或內部的鍵,或者與 存儲類說明靜態具有靜態存儲持續時間的對象。它 壽命程序

的整個執行即「靜態存儲」變量包括與C static關鍵字聲明都全局變量和變量。在TLDP文章中,它指的是前者。

+0

對於內核模塊,什麼是「程序」?它是整個內核還是隻是模塊? – daltonfury42

+0

在全局變量方面,內核鏈接階段比用戶級程序更嚴格。內核構建可防止從模塊訪問任何全局變量,除非通過調用'EXPORT_SYMBOL'宏來顯式標記它們。 – kaylum

+0

你能告訴我爲什麼所有的全局變量都需要聲明爲靜態的嗎? – daltonfury42

相關問題