關(guān)于全局變量定義的順序問題

最近踩到一坑,編譯cpp 文件的順序不同導(dǎo)致程序異常偿曙。
假設(shè)一個類A中定義了靜態(tài)成員變量羔巢,在寧一個類B的構(gòu)造中需要用到這個靜態(tài)成員變量。那么如果用 類B 來聲明一個全局對象启摄,就得注意了幽钢。有可能在 類B構(gòu)造過程中,類A 的靜態(tài)成員變量還未初始化導(dǎo)致異常蕾羊。
解決方法, 可以在編譯鏈接的時候保證,類A 的靜態(tài)成員變量初始化的地方出現(xiàn)在類B 的構(gòu)造前面书闸。
logging.hpp

#pragma once
#include <iostream>
#include <functional>
#include <map>
#include <string>
using std::string;
class CLog
{
     public:
         enum class ELevel{eTrace,eDebug};
         typedef std::function<void(ELevel,const string &,const string &)> PFunction;
         CLog(ELevel value,const string &szDomain);
         void SetFunction(ELevel eLevel,PFunction Function);
    private:
        typedef std::map<ELevel,PFunction> DestMap;
        
        static DestMap m_DestMap;
        ELevel m_eLevel;
        string m_szDomain;
  
};

void InitLog();
class CLogger
{
    public:
        CLogger()
        {
            std::cout << "test: CLogger" << std::endl;
            InitLog();
         }

};

logging.cpp

#include <functional>
#include <iostream>
#include "logging.hpp"
CLog::CLog(ELevel eLevel,const std::string & szDomain)
    :m_eLevel(eLevel),m_szDomain(szDomain)
{
    std::cout <<" test: CLog" <<std::endl;
}

void CLog::SetFunction(ELevel eLevel, PFunction Function)
{
    m_DestMap[eLevel] = Function;
}


void OutputTest(CLog::ELevel eLevel ,const std::string &szDomain,const std::string &szBody)
{
    std::cout << "test : OutputTest." << std::endl;
}

void InitLog()
{
    CLog Log(CLog::ELevel::eDebug,"test");
    Log.SetFunction(CLog::ELevel::eDebug,OutputTest);
}

main.cpp

#include "logging.hpp"
#include <iostream>
//由于 Logger 構(gòu)造過程中用到了 m_DestMap, 但是此時 m_DestMap 并沒有初始化
//導(dǎo)致程序崩潰浆劲, 應(yīng)該寫成CLog::Destmap CLog::m_DestMap;CLogger Logger;
CLogger Logger;
CLog::DestMap CLog::m_DestMap;

int main()
{
    std::cout << " test: main"<<std::endl;
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市割按,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖择示,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栅盲,死亡現(xiàn)場離奇詭異,居然都是意外死亡扒寄,警方通過查閱死者的電腦和手機(jī)拟烫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門硕淑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人于樟,你說我怎么就攤上這事拇囊。” “怎么了路捧?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谒拴。 經(jīng)常有香客問我涉波,道長,這世上最難降的妖魔是什么苍日? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮窗声,結(jié)果婚禮上相恃,老公的妹妹穿的比我還像新娘。我一直安慰自己笨觅,他們只是感情好拦耐,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著见剩,像睡著了一般杀糯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苍苞,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天固翰,我揣著相機(jī)與錄音,去河邊找鬼羹呵。 笑死,一個胖子當(dāng)著我的面吹牛冈欢,可吹牛的內(nèi)容都是我干的歉铝。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼凑耻,長吁一口氣:“原來是場噩夢啊……” “哼犯戏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拳话,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤先匪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弃衍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呀非,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岸裙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猖败。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖降允,靈堂內(nèi)的尸體忽然破棺而出恩闻,到底是詐尸還是另有隱情,我是刑警寧澤剧董,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布幢尚,位于F島的核電站,受9級特大地震影響翅楼,放射性物質(zhì)發(fā)生泄漏尉剩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一毅臊、第九天 我趴在偏房一處隱蔽的房頂上張望理茎。 院中可真熱鬧,春花似錦管嬉、人聲如沸皂林。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽础倍。三九已至,卻和暖如春求厕,著一層夾襖步出監(jiān)牢的瞬間著隆,已是汗流浹背扰楼。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工呀癣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弦赖。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓项栏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹬竖。 傳聞我的和親對象是個殘疾皇子沼沈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

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