天天看點

核心函數前面單下劃線和雙下劃線

 在我們閱讀核心代碼時,經常會看到有的函數名稱前面會帶有“_ _”的雙下劃線,而有些又沒有,這個有什麼用呢?

原來核心API函數具有這種名稱的,通常都是一些接口的底層函數,應該謹慎使用。實質上,這裡的雙下劃線就是要告訴程式員:謹慎調用,後則後果自負。舉個例子,在核心子產品的初始函數時,實際的定義如下:

static int _ _init initializition_function(void)

{

}

module_init(initialization_function);

還有清除函數:

static void _ _exit cleanup_function(void)

{

}

module_exit(cleanup_function);

因為清除函數沒有傳回值,是以會被聲明為void。_ _exit 修飾詞标記該代碼僅用于子產品解除安裝(編譯器将把該函數放在特殊的ELF段中),如果在編譯時被編譯進核心,而不是以子產品化編譯,則這個函數将會被忽略丢掉,它隻能在子產品被解除安裝或者是關閉系統的時候被調用,其他的任務時間的調用都是錯誤的。

這裡面就用到了_ _init 和_ _exit有雙下劃線函數,雖然這個函數看起來的點不一般,它對核心來說是一種暗示,表明這個函數是在子產品初始化的時候使用。但是當子產品被解除安裝後,子產品裝載器就會把這個函數給丢棄掉,将這個子產品占用的系統資源釋放。

       是以當我們在寫程式代碼或者是修改核心代碼時,如果希望在初始化結束後仍然使用這個函數或者是資料結構,就千萬不要加上雙下劃線,否則會帶來意想不到的嚴重後果。

繼續閱讀