亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

解析在main函數之前調用函數以及對設計的作用詳解

2020-01-26 16:10:38
字體:
來源:轉載
供稿:網友
前幾天為新員工寫一個簡單的測試框架,可讓他們方便的寫測試用例并且執行。期間遇到一個問題就是如何讓他們增加測試用例而用不影響測試框架的代碼?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++中的單件模式。參考《設計模式》
單件模式有一個最大的特點就是可以在運行過程中連接單件。如果使用條件語句來決定使用哪個單件硬性限定了可能的單件集合。所以,書中引入了一個單件注冊表的概念,書中對單件注冊表的初始化采用的是如下的做法:
首先定義一個單件類,在單件類的構造函數中調用單件的注冊函數注冊自身:
復制代碼 代碼如下:

MySingleton::MySingleton()
{
...
Singleton::Register("MySingleton", this);
}

這個函數是怎么被調用的那?可以定義一個靜態實例:
static MySingleton theSingleton;
這樣就會在main函數之前調用MySingleton的構造函數來構造這個靜態實例,從而達到像注冊表注冊的目的。
這個方案有個缺點:它能夠成功存在一個前提,就是在theSingleton實例化之前,單件注冊表列表必須存在,否則會失敗。則其實只是一個可能失敗的點,如果MySingleton還應用其他的全局變量,則可能這個時候這些全局變量還沒有初始化。
解決這個問題的一個方案就是將單件注冊的時間由構造函數移到main函數之前調用的函數中來。
定義函數:
復制代碼 代碼如下:

static void before_main()
{
Singleton::Register("MySingleton", &theSingleton);
}
聲明:
staitc void before_main()__attribute__((constructor));

before_main會在main函數之前調用,而調用時全局變量已經全部初始化,這樣就可以避免上面的問題。
其實單件不單單可以在c++(面向對象)中使用,也可以在c中使用。而且有了c的這個特性后,單件更好用。
2、構造插件開發框架,而不用對框架進行更改。
構造插件開發框架的一個問題是:如何新增一個插件而不用修改主框架代碼就可以調用插件代碼。一般情況下都會使用插件注冊機制。也就是框架對外提供注冊接口,插件使用這些接口進行注冊。c要實行此功能,一個可行的方案是在插件中定義main之前執行的函數,在此函數中調用插件注冊接口完成注冊。(注:這里討論的是插件的靜態加載)。
3、一個模塊有一些初始化工作要做,使用這種機制可以不更改main或者函數。
拋開插件框架,使用這個特性也可以對c的模塊化進行很多優化。比如,可以把各個模塊的初始化工作放在main之前進行從而防止對main的頻繁修改。
注:本文描述的環境為linux c,c++。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区日韩在线| 在线成人一区二区| 日韩美女视频在线观看| 国产一区二区三区直播精品电影| 国产精品第100页| 亚洲人高潮女人毛茸茸| 国产亚洲视频在线观看| 亚洲成人网av| 亚洲国产精品999| 亚洲一区www| 欧美壮男野外gaytube| 最近2019年中文视频免费在线观看| 97人人爽人人喊人人模波多| 亚洲第一区中文字幕| 日韩精品在线第一页| 日本一区二三区好的精华液| 国内精品中文字幕| 68精品国产免费久久久久久婷婷| 欧美美女操人视频| 亚洲色图偷窥自拍| 亚洲精品成人免费| 国产精品入口免费视频一| 国产精品久久久久久av下载红粉| 国精产品一区一区三区有限在线| 欧美视频一二三| 亚洲xxx大片| 国产精品一区久久| 日韩视频免费大全中文字幕| 欧美午夜激情在线| 欧美视频在线观看免费| 久久久亚洲网站| 国产精品jizz在线观看麻豆| 日韩久久精品电影| 日韩精品中文字幕在线| 久久青草福利网站| 2018中文字幕一区二区三区| 精品福利一区二区| 久久久精品免费视频| 国产亚洲精品激情久久| 中文字幕不卡在线视频极品| 国产亚洲视频在线| 亚洲人成网站色ww在线| 成人高清视频观看www| 欧美高清性猛交| 日韩av电影在线网| 国产精品手机播放| 国产精品极品美女在线观看免费| 欧美人与性动交a欧美精品| 精品小视频在线| 色综合影院在线| 最近日韩中文字幕中文| 国产中文字幕亚洲| 亚洲va欧美va国产综合久久| 国产精品美女免费看| 成人xvideos免费视频| 欧美成人网在线| 亚洲国产日韩欧美在线图片| 日韩高清电影好看的电视剧电影| 久久精品国产欧美亚洲人人爽| 欧美精品video| 91色视频在线导航| 日韩av高清不卡| 国产精品日韩欧美大师| 5566日本婷婷色中文字幕97| 91精品国产色综合久久不卡98| 欧美亚洲国产视频| 国产国语videosex另类| 日韩精品免费在线视频| 亚洲一区二区中文字幕| 日韩精品在线视频观看| 久久久精品影院| 欧美激情一级欧美精品| 精品偷拍一区二区三区在线看| 中文字幕综合在线| 精品偷拍一区二区三区在线看| 午夜精品久久久久久久99热浪潮| 亚洲www在线| 欧美日韩国产中字| 国产精品露脸av在线| 2021国产精品视频| 久久久久久久国产| 亚洲欧美激情一区| 久久不射电影网| 国产精品中文字幕久久久| 伊人亚洲福利一区二区三区| 福利二区91精品bt7086| 亚洲国产精品yw在线观看| 亚洲欧美另类中文字幕| 中文字幕欧美精品日韩中文字幕| 精品成人av一区| 亚洲成人久久电影| 国产在线a不卡| 日韩中文字幕精品| 91免费电影网站| 国产va免费精品高清在线| 日韩成人黄色av| 日韩精品中文字幕视频在线| 亚洲欧美中文在线视频| 日韩不卡在线观看| 亚洲人成绝费网站色www| 久久免费视频这里只有精品| 国产91色在线播放| 国产视频久久网| 色系列之999| 久久综合久久八八| 激情久久av一区av二区av三区| 成人黄色短视频在线观看| 欧美视频专区一二在线观看| 91精品国产成人www| 国产美女精品视频免费观看| 免费不卡欧美自拍视频| 中文字幕成人在线| 精品亚洲精品福利线在观看| 久久久999国产精品| 欧美噜噜久久久xxx| 欧美激情在线播放| 久久久久久亚洲精品| 伊人久久男人天堂| 日韩中文字幕国产| 欧美一区二区三区……| 日韩亚洲综合在线| 欧美成人午夜激情视频| 伊人精品在线观看| 成人av在线亚洲| 亚洲aa中文字幕| 亚洲成人激情在线| 久久97久久97精品免视看| 色妞久久福利网| 国产精品视频在线观看| 国产精品国语对白| 日韩电影大全免费观看2023年上| 美女性感视频久久久| 日韩美女视频免费看| 欧美小视频在线观看| 久久久久久综合网天天| 色偷偷av亚洲男人的天堂| 欧美视频13p| 国产一区二区黑人欧美xxxx| 国产精品扒开腿做爽爽爽视频| 精品高清一区二区三区| 久久精品国产一区二区三区| 国产精品福利在线观看| 国产综合福利在线| 日韩av在线不卡| 国产精品96久久久久久又黄又硬| 性欧美长视频免费观看不卡| 国产日产久久高清欧美一区| 91在线播放国产| 日韩欧美精品中文字幕| 亚洲精品久久久久久久久久久久久| xxxxxxxxx欧美| 日韩电影中文字幕| 久久中文精品视频| 最近2019年日本中文免费字幕| 91po在线观看91精品国产性色| 热久久美女精品天天吊色| 久久99青青精品免费观看| 伊人一区二区三区久久精品| 国产成人久久精品| 91豆花精品一区| 一本色道久久88综合亚洲精品ⅰ| 欧美大片网站在线观看| 亚洲韩国青草视频| 日韩电视剧免费观看网站|