假設我們需要提供乙個 so 給其他人用,並這個 so 需要執行初始化動作,你會怎麼來設計?
這種方法應該是最容易想到到的,直接簡單粗暴,提供介面,讓呼叫者來處理,示例如下:
/****** method1.c ******/
void method1_init(void)
void method1_dosomething(void)
/****** main.c ******/
extern void method1_init(void);
extern void method1_dosomething(void);
int main(int argc, char *ar**)
直接上碼再說吧。
/***** method2.c *****/
void __method2_init(void);
void __method2_dosomething(void);
static void (*fun)(void) = __method2_init;
void __method2_init(void)
void __method2_dosomething(void)
void method2_dosomething(void)
/****** main.c ******/
extern void method2_dosomething(void);
int main(int argc, char *ar**)
這裡的 method2_dosomething 介面既是提供服務的介面也是初始化的介面。
只會在第一次呼叫它的時候執行 init 動作,這裡利用了函式指標,對呼叫者來說非常的友好。
嚴格來做這裡的靜態函式指標變數相當於引入了狀態,在多執行緒呼叫過程中需要加鎖。
這裡用到了 gcc 的乙個設定函式屬性的功能,讓其在載入過程自動的被呼叫,如下:
/***** method3.c *****/
__attribute__((constructor)) void __method3_init(void)
void method3_dosomething(void)
/****** main.c ******/
extern void method3_dosomething(void);
int main(int argc, char *ar**)
被__attribute__((constructor))
修飾的函式會先於 main 函式執行,同時會自動的被呼叫。
這種方法得益於編譯器的支援,對於呼叫者來說也是非常友好,同時不需要像方法2一樣在多執行緒使用中需要用到鎖的機制,此種方法實現更簡單。
好了,這裡主要介紹三種怎麼處理乙個模組初始化的方法,三種各有優缺點吧,適合才是最好的,專案中選擇最適合自己實際情況的方法就好。
初始化 MyBatis初始化之載入初始化
在mybatis初始化過程中,大致會有以下幾個步驟 1.建立configuration全域性配置物件,會往typealiasregistry別名註冊中心新增mybatis需要用到的相關類,並設定預設的語言驅動類為xmllanguagedriver 3.構建defaultsqlsessionfacto...
Python list 初始化技巧
1.1 遞增列表 初始化遞增的list,與l i for i in range 10 效果相同 l range 10 版本變化 l i for i in range 10 print l 0,1,2,3,4,5,6,7,8,9 1.0 常數0列表 初始化每項為0的一維列表 method 1 l 0 ...
8259 8255 8237初始化程式設計
原則 題目沒提到的都設為0 8259a初始化程式設計 icw1初始化命令字 0001 邊緣觸發 0 級聯 需要icw3 不需要icw4 icw4 初始化命令字 a0 1,icw4必須寫入8259a的奇位址埠。d7 d5,這3位總是為0,用來表示icw4的標識碼。8255a初始化程式設計 初始化控制字...