程式設計技巧分享之so的初始化

2021-10-06 21:58:17 字數 1492 閱讀 2170

假設我們需要提供乙個 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初始化程式設計 初始化控制字...