爲什麼linux代碼中設備驅動程序中大多數函數定義被定義爲靜態的原因是什麼?是否有一個原因?Linux設備驅動程序中的靜態函數?
我被告知這是爲了確定範圍並防止命名空間污染,任何人都可以詳細解釋爲什麼靜態定義在此上下文中使用?
爲什麼linux代碼中設備驅動程序中大多數函數定義被定義爲靜態的原因是什麼?是否有一個原因?Linux設備驅動程序中的靜態函數?
我被告知這是爲了確定範圍並防止命名空間污染,任何人都可以詳細解釋爲什麼靜態定義在此上下文中使用?
聲明爲靜態的函數在它們定義的翻譯單元之外不可見(翻譯單元基本上是一個.c文件)。如果函數不需要從文件外部調用,那麼它應該是靜態的,以免污染全局名稱空間。這使得相同的名稱之間的衝突不太可能發生。導出的符號通常用某種子系統標籤來識別,這進一步減少了衝突的範圍。
通常,指向這些函數的指針最終會出現在結構體中,所以它們實際上是從它們定義的文件外部調用的,而不是它們的函數名稱。
出於同樣的原因,您在任何代碼中都使用static。你只應該「發佈」你的API調用,其他任何事情都會打開你的濫用行爲,比如能夠從驅動之外調用內部函數,這些幾乎肯定會是災難性的。
這是一個良好的編程習慣,只有讓外界能夠看到什麼是必要的。這就是封裝的全部內容。
我同意。這是任何C代碼中的常見和明智的做法 - 不僅僅是內核代碼!不要以爲這隻適用於低級別的東西,任何延伸過一個.c文件的C代碼都應該考慮到這一點。