最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析在main函數(shù)之前調(diào)用函數(shù)以及對(duì)設(shè)計(jì)的作用詳解

 更新時(shí)間:2013年05月23日 16:45:32   作者:  
本篇文章是對(duì)在main函數(shù)之前調(diào)用函數(shù)以及對(duì)設(shè)計(jì)的作用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
前幾天為新員工寫一個(gè)簡單的測試框架,可讓他們方便的寫測試用例并且執(zhí)行。期間遇到一個(gè)問題就是如何讓他們增加測試用例而用不影響測試框架的代碼?c++的單件模式可以解決這個(gè)問題,但是其中一個(gè)難點(diǎn)是要在main之前注冊單件。c++可以通過構(gòu)造函數(shù)來實(shí)現(xiàn)注冊,c如何注冊?
最后查了下資料,原來可以定義在main之前調(diào)用的函數(shù)!有了這個(gè)特性可以改善c的模塊化設(shè)計(jì)。
特性介紹:
如果想定義在main函數(shù)之前調(diào)用的函數(shù),可以在函數(shù)的聲明之后加上一句“__attribute__((constructor))”,如下:
int before()__attribute__((constructor));
如果想定義在main函數(shù)之后調(diào)用的函數(shù),可以在函數(shù)的聲明之后加上一句“__attribute__((destructor))”,如下:
int after()__attribute__((destructor));
可以看得出來,應(yīng)該類似于c++中的構(gòu)造和析構(gòu)。

一些細(xì)節(jié)問題:
寫測試代碼測試了一下這個(gè)程序,發(fā)現(xiàn)幾點(diǎn):
1、before在main之前調(diào)用,調(diào)用之前,各個(gè)全局變量已經(jīng)完成初始化。也就是說,這些函數(shù)是在全局變量初始化之后,main函數(shù)之前調(diào)用的。這一點(diǎn)是非常重要的,否則可能會(huì)引起很多的問題。
2、after在main之后調(diào)用,但是有一點(diǎn)比較特殊,必須是在main中return的話才執(zhí)行,否則,需要通過atexit執(zhí)行某函數(shù)。這個(gè)特性目前對(duì)我沒有太大的用處。
3、在main函數(shù)之前調(diào)用的函數(shù)可以聲明為static。
4、在main函數(shù)之前調(diào)用的函數(shù)可以調(diào)用多個(gè)。這里就有一個(gè)問題,就是這些函數(shù)的調(diào)用順序的問題。這個(gè)問題首先是一個(gè)設(shè)計(jì)的問題,也就是,我們應(yīng)該設(shè)計(jì)這些函數(shù)為順序無關(guān)的函數(shù)。另外,調(diào)用順序和編譯的順序相關(guān),我在linux下使用make進(jìn)行編譯,發(fā)現(xiàn)最后編譯的源文件中的函數(shù)會(huì)最先調(diào)用。
5、可以在庫(動(dòng)態(tài)庫和靜態(tài)庫)中定義這樣的函數(shù)。

用對(duì)設(shè)計(jì)的作用:
1、可以優(yōu)化c++中的單件模式。參考《設(shè)計(jì)模式》
單件模式有一個(gè)最大的特點(diǎn)就是可以在運(yùn)行過程中連接單件。如果使用條件語句來決定使用哪個(gè)單件硬性限定了可能的單件集合。所以,書中引入了一個(gè)單件注冊表的概念,書中對(duì)單件注冊表的初始化采用的是如下的做法:
首先定義一個(gè)單件類,在單件類的構(gòu)造函數(shù)中調(diào)用單件的注冊函數(shù)注冊自身:
復(fù)制代碼 代碼如下:

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

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

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

before_main會(huì)在main函數(shù)之前調(diào)用,而調(diào)用時(shí)全局變量已經(jīng)全部初始化,這樣就可以避免上面的問題。
其實(shí)單件不單單可以在c++(面向?qū)ο螅┲惺褂?,也可以在c中使用。而且有了c的這個(gè)特性后,單件更好用。
2、構(gòu)造插件開發(fā)框架,而不用對(duì)框架進(jìn)行更改。
構(gòu)造插件開發(fā)框架的一個(gè)問題是:如何新增一個(gè)插件而不用修改主框架代碼就可以調(diào)用插件代碼。一般情況下都會(huì)使用插件注冊機(jī)制。也就是框架對(duì)外提供注冊接口,插件使用這些接口進(jìn)行注冊。c要實(shí)行此功能,一個(gè)可行的方案是在插件中定義main之前執(zhí)行的函數(shù),在此函數(shù)中調(diào)用插件注冊接口完成注冊。(注:這里討論的是插件的靜態(tài)加載)。
3、一個(gè)模塊有一些初始化工作要做,使用這種機(jī)制可以不更改main或者函數(shù)。
拋開插件框架,使用這個(gè)特性也可以對(duì)c的模塊化進(jìn)行很多優(yōu)化。比如,可以把各個(gè)模塊的初始化工作放在main之前進(jìn)行從而防止對(duì)main的頻繁修改。
注:本文描述的環(huán)境為linux c,c++。

相關(guān)文章

  • C語言實(shí)現(xiàn)簡單的三子棋游戲源碼

    C語言實(shí)現(xiàn)簡單的三子棋游戲源碼

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單的三子棋游戲源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言修煉之路初識(shí)指針陰陽竅?地址還歸大道真上篇

    C語言修煉之路初識(shí)指針陰陽竅?地址還歸大道真上篇

    指針是指向另一個(gè)變量的變量。意思是一個(gè)指針保存的是另一個(gè)變量的內(nèi)存地址。換句話說,指針保存的并不是普通意義上的數(shù)值,而是另一個(gè)變量的地址值。一個(gè)指針保存了另一個(gè)變量的地址值,就說這個(gè)指針“指向”了那個(gè)變量
    2022-02-02
  • C++基礎(chǔ)知識(shí)實(shí)例解析(一)

    C++基礎(chǔ)知識(shí)實(shí)例解析(一)

    這篇文章主要對(duì)C++基礎(chǔ)知識(shí)實(shí)例解析,通過四個(gè)簡短的案例,鞏固大家的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • 深入理解Java事務(wù)的原理與應(yīng)用

    深入理解Java事務(wù)的原理與應(yīng)用

    下面小編就為大家?guī)硪黄钊肜斫釰ava事務(wù)的原理與應(yīng)用。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • C語言之復(fù)雜鏈表的復(fù)制詳解

    C語言之復(fù)雜鏈表的復(fù)制詳解

    這篇文章主要為大家詳細(xì)介紹了C語言之復(fù)雜鏈表的復(fù)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Qt?事件處理機(jī)制的深入理解

    Qt?事件處理機(jī)制的深入理解

    本文主要介紹了Qt?事件處理機(jī)制的深入理解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++中基本的輸入輸出函數(shù)使用指南

    C++中基本的輸入輸出函數(shù)使用指南

    這篇文章主要介紹了C++中基本的輸入輸出函數(shù)使用指南,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C語言算法學(xué)習(xí)之雙向鏈表詳解

    C語言算法學(xué)習(xí)之雙向鏈表詳解

    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。本文主要介紹了C語言算法中雙向鏈表的實(shí)現(xiàn),需要的可以參考一下
    2022-05-05
  • C++利用模板實(shí)現(xiàn)消息訂閱和分發(fā)功能

    C++利用模板實(shí)現(xiàn)消息訂閱和分發(fā)功能

    C++語言支持重載,模板,虛函數(shù)等特性,為編寫高性能可擴(kuò)展的程序提供了利器。本文就講利用模板實(shí)現(xiàn)消息訂閱和分發(fā)功能,感興趣的小伙伴可以了解一下
    2022-12-12
  • c/c++ 奇技淫巧(一些c語言的技巧)

    c/c++ 奇技淫巧(一些c語言的技巧)

    這篇文章主要介紹了c/c++ 奇技淫巧,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

静宁县| 石渠县| 顺昌县| 聊城市| 南昌县| 蓝田县| 长治县| 文成县| 鄂州市| 叙永县| 仁寿县| 磐石市| 贵阳市| 西藏| 慈溪市| 琼中| 民权县| 河南省| 东乌珠穆沁旗| 莆田市| 洪泽县| 天水市| 阳春市| 怀来县| 正镶白旗| 天峨县| 广西| 四川省| 璧山县| 南宁市| 宁城县| 德清县| 鹤岗市| 龙游县| 兰坪| 洛浦县| 昌吉市| 临桂县| 二连浩特市| 平顶山市| 瑞昌市|