C++中如何指定全局對(duì)象的初始化順序

這個(gè)問(wèn)題出現(xiàn)在,程序里有一個(gè)數(shù)據(jù)庫(kù)對(duì)象阳堕,是被全局依賴(lài)的跋理,剛開(kāi)始的時(shí)候程序比較簡(jiǎn)單。后來(lái)程序變復(fù)雜了恬总,有多個(gè)全局對(duì)象依賴(lài)它前普。那么問(wèn)題來(lái)了,我能不能讓它們自動(dòng)按順序初始化壹堰?

1.首先從簡(jiǎn)單的情況看看拭卿,最簡(jiǎn)單的了,就是這樣子贱纠,還是用代碼來(lái)演示吧:

#include<cstdio>
using namespace std;
class A
{
public:
      A(int id):id(id) { 
            printf("A::A(),id=%d\n", id);
       }
      ~A() { 
             printf("A::~A(),id=%d\n", id); 
        }
private: 
         int id;
};


A a1(1);
A a2(2);
int main()
{
     A a(3);  
     return 0;
}

執(zhí)行后得到:

A::A(),id=1
A::A(),id=2
A::A(),id=3
A::~A(),id=3
A::~A(),id=2
A::~A(),id=1

從gcc的表現(xiàn)來(lái)看峻厚,在單個(gè)文件里,全局對(duì)象的初始化是按出現(xiàn)的順序來(lái)的谆焊。

2.在上面的基礎(chǔ)上惠桃,將全局對(duì)象分布到不同的文件里看看會(huì)怎么樣

cpp1

#include "ck.h"
using namespace std;

A a1(1);
A a4(4);
int main()
{
   A a(3);
   return 0;
}

cpp2

#include "ck.h"
A a2(2);
A a5(5);

ck.h

#include<cstdio>
using namespace std;
class A
{
public:
  A(int id):id(id) { 
        printf("A::A(),id=%d\n", id); 
    }
  ~A() { 
        printf("A::~A(),id=%d\n",id);
     }
private:  
        int id;
};

編譯執(zhí)行得到的結(jié)果是:

A::A(),id=2
A::A(),id=5
A::A(),id=1
A::A(),id=4
A::A(),id=3
A::~A(),id=3
A::~A(),id=4
A::~A(),id=1
A::~A(),id=5
A::~A(),id=2

看不出有什么順序?或者本來(lái)就是亂序辖试?但還是能夠看出來(lái)辜王,同一個(gè)文件里的全局對(duì)象是按順序的,不同文件的就很難說(shuō)了罐孝。

3.能不能不要猜呐馆?或者說(shuō)強(qiáng)制指定編譯順序?

gcc提供了一個(gè)特性肾档,利用它可以指定對(duì)象的初始化優(yōu)先級(jí)摹恰,例如

Some_Class  A  __attribute__ ((init_priority (2000)));
Some_Class  B  __attribute__ ((init_priority (543)));

利用它我們可以達(dá)到自己想要的目的辫继,將上面的代碼修改為:

A a1  __attribute__ ((init_priority (1000))) (1);
A a4  __attribute__ ((init_priority (4000))) (4);

A a2 __attribute__ ((init_priority (2000))) (2);
A a5 __attribute__ ((init_priority (5000))) (5);

執(zhí)行得到的結(jié)果為:

A::A(),id=1
A::A(),id=2
A::A(),id=4
A::A(),id=5
A::A(),id=3
A::~A(),id=3
A::~A(),id=5
A::~A(),id=4
A::~A(),id=2
A::~A(),id=1

經(jīng)過(guò)驗(yàn)證怒见,使用init_priority確實(shí)能夠達(dá)到我想要的效果。

4.代碼級(jí)解決方案

如果覺(jué)得編譯器的方案也不是很完善姑宽,不能自己把握全局遣耍,那就自己寫(xiě)一個(gè)管理器,在管理器里對(duì)各個(gè)對(duì)象進(jìn)行順序初始化炮车。這里的代碼我就不演示了舵变。

5.總結(jié):最好不要用全局對(duì)象酣溃,即使用了全局對(duì)象,初始化的時(shí)候也最好放在一個(gè)文件里纪隙。如果一定要用全局對(duì)象赊豌,需要注意全局對(duì)象的初始化順序依賴(lài)問(wèn)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绵咱,一起剝皮案震驚了整個(gè)濱河市碘饼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悲伶,老刑警劉巖艾恼,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異麸锉,居然都是意外死亡钠绍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)花沉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柳爽,“玉大人,你說(shuō)我怎么就攤上這事碱屁⌒豪梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵忽媒,是天一觀的道長(zhǎng)争拐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晦雨,這世上最難降的妖魔是什么架曹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮闹瞧,結(jié)果婚禮上绑雄,老公的妹妹穿的比我還像新娘。我一直安慰自己奥邮,他們只是感情好万牺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著洽腺,像睡著了一般脚粟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蘸朋,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天核无,我揣著相機(jī)與錄音,去河邊找鬼藕坯。 笑死团南,一個(gè)胖子當(dāng)著我的面吹牛噪沙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吐根,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼正歼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拷橘?” 一聲冷哼從身側(cè)響起朋腋,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膜楷,沒(méi)想到半個(gè)月后旭咽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赌厅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年穷绵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片特愿。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仲墨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揍障,到底是詐尸還是另有隱情目养,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布毒嫡,位于F島的核電站癌蚁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兜畸。R本人自食惡果不足惜努释,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咬摇。 院中可真熱鬧伐蒂,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至漱逸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工烛卧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妓局。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓总放,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親好爬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子局雄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容