Effective C++ item01 盡量以const enum inline替換#define

技術(shù)交流QQ群:1027579432阔挠,歡迎你的加入医舆!

1.盡量用const竭翠、enum振坚、inline代替宏#define

  • 使用編譯器替換預處理器,或許#define可以不被視為C++語言中的一部分斋扰,如下面的代碼:
        #define PI 3.14
    
  • 名稱PI也行從來都沒有被編譯器看到過渡八,也許在編譯器開始處理源碼之前,它就已經(jīng)被預處理器移走了传货。于是屎鳍,PI有可能沒進入記號表中,所以導致當使用此常量但獲得一個編譯錯誤信息時问裕,可能會帶來困惑逮壁,因為這個錯誤也會會提到3.14而不是PI;如果PI被定義在一個不是自己寫的頭文件中粮宛,我們可能對3.14的含義一無所知窥淆。解決的方法是使用常量替換上面的宏,見下面的代碼
        const double Pi = 3.14;  // 宏名一般是大寫的
    
  • 浮點常量Pi肯定會被編譯器看到巍杈,當然會進入記號表中忧饭。此外,使用浮點常量Pi將會比使用宏有較小的代碼量筷畦,因為使用宏時词裤,會盲目的將宏名稱PI替換成3.14,可能導致目標代碼出現(xiàn)多份的3.14鳖宾,但是使用浮點常量絕不會出現(xiàn)相同的情況吼砂。

2.使用常量代替宏#define的兩種特殊情況

  • 2.1 定義常量指針
    • 由于常量定義式通常被放在頭文件中,以便被不同的源碼所包含鼎文。因此渔肩,有必要將指針聲明為const。例如在頭文件中定義一個常量的char*-base字符串漂问,必須寫const兩次赖瞒。下面的情況使用string類的對象會比使用指向常量的常量指針更好。
          const char* const authorName = "Curry_Coder";  // 指向常量的常量指針
          const string authorName = "Curry_Coder";
      
  • 2.2 class的專屬常量
    • 為了將常量的作用域限制在class中蚤假,必須將常量作為class中的一個成員栏饮,為了確保常量至多只有一份實體,必須讓常量成為靜態(tài)成員變量磷仰。無法使用#define創(chuàng)建一個class專屬常量袍嬉,因為#define并不重視作用域,一旦宏被定義后,它就在其后的編譯過程中有效伺通。這意味著#define不僅不能用來定義class專屬常量箍土,也不能提供任何的封裝,沒有訪問權(quán)限的限制罐监,但const成員變量是可以被封裝的吴藻。
          class GamePlayer{
              public:
                  static const int NumTurns = 5;  // 常量聲明
                  int scores[NumTurns];
          };
      
    • 當編譯器不允許使用static int class 常量來完成類內(nèi)部的初值設定時,可以使用所謂的enum hack補償?shù)淖龇ü匆粋€屬于枚舉類型的數(shù)值可以當做int類型使用沟堡,enum可以讓別人無法獲得一個指針或引用指向你的某個整數(shù)常量,如下面的例子:
          class GamePlayers{
              private:
                  enum {NumTurns = 5};
                  int socres[NumTurns];
                  // TODO;
          };
      

3.#define誤用的情況

  • 宏看起來像函數(shù)矢空,但不會產(chǎn)生函數(shù)調(diào)用航罗,從而導致額外的開銷。下面是帶參數(shù)的宏屁药,調(diào)用函數(shù)f:
        #define CALL_MAX(a, b) f((a) > (b) ? (a):(b))
    
  • 上面的宏存在太多的缺點粥血,當寫出上面的宏時,必須記住為宏中的所有實參加上()酿箭,否則別人在表達式中調(diào)用這個宏時會帶來疑惑复亏。但有時候即使加上(),也會產(chǎn)生不可思議的事情:
        int a = 5; b = 0;
        CALL_MAX(++a, b);  // a被加2次
        CALL_MAX(++a, b+10);  // a被加1次
    
  • 使用內(nèi)聯(lián)的函數(shù)模板解決上面的問題,函數(shù)模板接收兩個同類型的對象七问,并以其中較大者調(diào)用f蜓耻,不需要為參數(shù)加上括號茫舶,如下面的例子:
        template<typename T>
        inline void call_max(const T &a, const T &b){
            f(a > b) ? a:b;
        }
    

4.總結(jié)

  • 對于單純的常量械巡,最好使用const對象會enum代替#define宏
  • 對于類似于函數(shù)的宏,最好改用inline函數(shù)替換#define

5.參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饶氏,一起剝皮案震驚了整個濱河市讥耗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疹启,老刑警劉巖古程,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喊崖,居然都是意外死亡挣磨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門荤懂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茁裙,“玉大人,你說我怎么就攤上這事节仿∥钭叮” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長矾瘾。 經(jīng)常有香客問我女轿,道長,這世上最難降的妖魔是什么壕翩? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任蛉迹,我火速辦了婚禮,結(jié)果婚禮上放妈,老公的妹妹穿的比我還像新娘婿禽。我一直安慰自己,他們只是感情好大猛,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布扭倾。 她就那樣靜靜地躺著,像睡著了一般挽绩。 火紅的嫁衣襯著肌膚如雪膛壹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天唉堪,我揣著相機與錄音模聋,去河邊找鬼。 笑死唠亚,一個胖子當著我的面吹牛链方,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灶搜,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼祟蚀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了割卖?” 一聲冷哼從身側(cè)響起前酿,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹏溯,沒想到半個月后罢维,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡丙挽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年肺孵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(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
  • 我被黑心中介騙來泰國打工键兜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穗泵。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓普气,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佃延。 傳聞我的和親對象是個殘疾皇子现诀,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

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