前幾天為新員工寫乙個簡單的測試框架,可讓他們方便的寫測試用例並且執行。期間遇到乙個問題就是如何讓他們增加測試用例而用不影響測試框架的**?c++
的單件模式可以解決這個問題,但是其中乙個難點是要在
main
之前註冊單件。
c++可以通過建構函式來實現註冊,
c如何註冊?
最後查了下資料,原來可以定義在main
之前呼叫的函式!有了這個特性可以改善
c的模組化設計。
特性介紹:
如果想定義在main
函式之前呼叫的函式,可以在函式的宣告之後加上一句「
__attribute__((constructor))
」,如下:
int before()__attribute__((constructor));
如果想定義在main
函式之後呼叫的函式,可以在函式的宣告之後加上一句「
__attribute__((destructor))
」,如下:
int after()__attribute__((destructor));
可以看得出來,應該類似於c++
中的構造和析構。
一些細節問題:
寫測試**測試了一下這個程式,發現幾點:
1、before
在main
之前呼叫,呼叫之前,各個全域性變數已經完成初始化。也就是說,這些函式是在全域性變數初始化之後,
main
函式之前呼叫的。這一點是非常重要的,否則可能會引起很多的問題。
2、after
在main
之後呼叫,但是有一點比較特殊,必須是在
main
中return
的話才執行,否則,需要通過
atexit
執行某函式。這個特性目前對我沒有太大的用處。
3、在main
函式之前呼叫的函式可以宣告為
static
。4、在
main
函式之前呼叫的函式可以呼叫多個。這裡就有乙個問題,就是這些函式的呼叫順序的問題。這個問題首先是乙個設計的問題,也就是,我們應該設計這些函式為順序無關的函式。另外,呼叫順序和編譯的順序相關,我在
linux
下使用make
進行編譯,發現最後編譯的原始檔中的函式會最先呼叫。
5、可以在庫(動態庫和靜態庫)中定義這樣的函式。
用對設計的作用:
1、可以優化
c++中的單件模式。參考《設計模式》
單件模式有乙個最大的特點就是可以在執行過程中連線單件。如果使用條件語句來決定使用哪個單件硬性限定了可能的單件集合。所以,書中引入了乙個單件登錄檔的概念,書中對單件登錄檔的初始化採用的是如下的做法:
首先定義乙個單件類,在單件類的建構函式中呼叫單件的註冊函式註冊自身:
view plain
mysingleton::mysingleton()
這個函式是怎麼被呼叫的那?可以定義乙個靜態例項:
static mysingleton thesingleton;
這樣就會在main
函式之前呼叫
mysingleton
的建構函式來構造這個靜態例項,從而達到像登錄檔註冊的目的。
這個方案有個缺點:它能夠成功存在乙個前提,就是在thesingleton
例項化之前,單件登錄檔列表必須存在,否則會失敗。則其實只是乙個可能失敗的點,如果
mysingleton
還應用其他的全域性變數,則可能這個時候這些全域性變數還沒有初始化。
解決這個問題的乙個方案就是將單件註冊的時間由建構函式移到main
函式之前呼叫的函式中來。
定義函式:
view plain
static
void
before_main()
宣告:
staitc void
before_main()__attribute__((constructor));
before_main會在
main
函式之前呼叫,而呼叫時全域性變數已經全部初始化,這樣就可以避免上面的問題。
其實單件不單單可以在c++
(物件導向)中使用,也可以在
c中使用。而且有了
c的這個特性後,單件更好用。
2、構造外掛程式開發框架,而不用對框架進行更改。
構造外掛程式開發框架的乙個問題是:如何新增乙個外掛程式而不用修改主框架**就可以呼叫外掛程式**。一般情況下都會使用外掛程式註冊機制。也就是框架對外提供註冊介面,外掛程式使用這些介面進行註冊。c
要實行此功能,乙個可行的方案是在外掛程式中定義
main
之前執行的函式,在此函式中呼叫外掛程式註冊介面完成註冊。(注:這裡討論的是外掛程式的靜態載入)。
3、乙個模組有一些初始化工作要做,使用這種機制可以不更改
main
或者函式。
拋開外掛程式框架,使用這個特性也可以對c
的模組化進行很多優化。比如,可以把各個模組的初始化工作放在
main
之前進行從而防止對
main
的頻繁修改。
注:本文描述的環境為linux c
,c++
。
在main函式之前呼叫函式,以及對設計的作用
前幾天為新員工寫乙個簡單的測試框架,可讓他們方便的寫測試用例並且執行。期間遇到乙個問題就是如何讓他們增加測試用例而用不影響測試框架的 c 的單件模式可以解決這個問題,但是其中乙個難點是要在main之前註冊單件。c 可以通過建構函式來實現註冊,c如何註冊?最後查了下資料,原來可以定義在main之前呼叫...
在main 之前和之後呼叫自己的函式
文章出處 作者 vision chen yeah.net 下面給出乙個可移植的在main 函式之前和之後呼叫自己函式的一種實現方式 借助全域性變數先於main 構造和後於main 析構的原理。include include void before main void after main names...
main函式執行之前
main函式是我們的主程式入口函式。那麼在執行main函式之前我們的程式幫我們做了些什麼了?實際上在我們的系統裝載程式之後,首先執行的 並不是main的第一行,而是某些特別的 這些 會準備好main函式需要的環境,並且負責呼叫main函式,這時候才可以在main了寫各種業務 1 設定棧指標。2 初始...