條款 02:盡量以 const艾扮,enum,inline 替換 #define

Effective C++ 中文版 第三版》讀書(shū)筆記

條款02:盡量以 const占婉,enum泡嘴,inline 替換 #define

簡(jiǎn)單地說(shuō)就是“寧可用編譯器替換預(yù)處理器”,因?yàn)榛蛟S #define 不被視為語(yǔ)言的一部分逆济。這正是問(wèn)題所在酌予,例如:

#define ASPECT_RATIO 1.653

記號(hào)名稱(chēng) ASPECT_RATIO 也許未被編譯器看見(jiàn)磺箕;也許在編譯器開(kāi)始處理源碼之前它就被預(yù)處理器移走了。于是記號(hào)名稱(chēng) ASPECT_RATIO 有可能沒(méi)有進(jìn)入記號(hào)表(symbol table)內(nèi)抛虫。于是當(dāng)你運(yùn)用此常量但卻獲得一個(gè)編譯錯(cuò)誤的信息時(shí)松靡,可能會(huì)帶來(lái)困惑,因?yàn)檫@個(gè)錯(cuò)誤信息也許會(huì)提到 1.653 而不是 ASPECT_RATIO建椰。如果 ASPECT_RATIO 被定義在一個(gè)不是我們自己寫(xiě)的文件內(nèi)雕欺,我們肯定對(duì) 1.653 以及它來(lái)自何處毫無(wú)概念,于是我們將因?yàn)樽粉櫵速M(fèi)大量不必要的時(shí)間棉姐。

解決之道是用常量替換上述的宏(#define):

const double ASPECT_RATIO = 1.653屠列;

作為一個(gè)語(yǔ)言常量,ASPECT_RATIO 肯定會(huì)被編譯器看到伞矩,當(dāng)然就會(huì)進(jìn)入記號(hào)表內(nèi)笛洛。此外因?yàn)轭A(yù)處理器 “盲目地將宏名稱(chēng) ASPECT_RATIO 替換為1.653” 可能導(dǎo)致目標(biāo)碼(Object code)出現(xiàn)多份 1.653,若使用常量 ASPECT_RATIO 絕不會(huì)出現(xiàn)這種情況扭吁。

當(dāng)我們以常量替換 #define 時(shí)撞蜂,

需要注意的問(wèn)題一:定義常量指針。

1.若要定義一個(gè)常量的(不變的)char*-based 字符串侥袜,你必須寫(xiě) const 兩次:

  const char* const AuthorName = "Toby";

2.string 對(duì)象通常比 char*-based 更好一些蝌诡,所以上面代碼往往寫(xiě)成:

  const std::string AuthorName = "Toby";

需要注意的問(wèn)題二:class 專(zhuān)屬常量。
1 為了將常量的作用域限制于class內(nèi)枫吧,你必須讓它成為class的一個(gè)成員浦旱;
2 而為確保此常量至多只有一份實(shí)體,你必須讓它成為一個(gè)static成員九杂。

class Toby {
private:
    static const int AuthorAge = 30;
}

基于數(shù)個(gè)理由 enum hack 值得我們認(rèn)識(shí)颁湖。第一,enum hack 的行為某方面說(shuō)比較像 #define 而不像 const例隆,有時(shí)候這正是我們需要的甥捺。例如取 const 的地址是合法的,但取一個(gè) enum 的地址就不合法镀层,而取一個(gè) #define 的地址通常也不合法镰禾。如果你不想讓別人獲得一個(gè) pointer 或 reference 指向你的某個(gè)整數(shù)常量,enum 可以幫你實(shí)現(xiàn)這個(gè)約束唱逢。enum 和 #define 一樣絕不會(huì)導(dǎo)致非必要的內(nèi)存分配吴侦。

有了 const、enum 和 inline坞古,我們對(duì)于處理器(特別是 #define)的需求降低了备韧,但并非完全消除。#include 仍是必需品痪枫,而 #ifdef/#ifndef 也繼續(xù)扮演控制編譯的重要角色织堂。目前還不是預(yù)處理器全面隱退的時(shí)候叠艳,但是我們應(yīng)該明確地將它們壓在箱子底盡量不要用它們。

請(qǐng)記着跬Α:
1 對(duì)于單純常量虑绵,最好以 const 對(duì)象或 enum 替換 #define
2 對(duì)于形似函數(shù)的宏(macro),最好用 inline 函數(shù)替換 #define

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闽烙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子声搁,更是在濱河造成了極大的恐慌黑竞,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疏旨,死亡現(xiàn)場(chǎng)離奇詭異很魂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)檐涝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)遏匆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谁榜,你說(shuō)我怎么就攤上這事幅聘。” “怎么了窃植?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵帝蒿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我巷怜,道長(zhǎng)葛超,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任延塑,我火速辦了婚禮绣张,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘关带。我一直安慰自己侥涵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布豫缨。 她就那樣靜靜地躺著独令,像睡著了一般。 火紅的嫁衣襯著肌膚如雪好芭。 梳的紋絲不亂的頭發(fā)上燃箭,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音舍败,去河邊找鬼招狸。 笑死敬拓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裙戏。 我是一名探鬼主播乘凸,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼累榜!你這毒婦竟也來(lái)了营勤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壹罚,失蹤者是張志新(化名)和其女友劉穎葛作,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猖凛,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赂蠢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辨泳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虱岂。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菠红,靈堂內(nèi)的尸體忽然破棺而出第岖,到底是詐尸還是另有隱情,我是刑警寧澤途乃,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布绍傲,位于F島的核電站,受9級(jí)特大地震影響耍共,放射性物質(zhì)發(fā)生泄漏烫饼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一试读、第九天 我趴在偏房一處隱蔽的房頂上張望杠纵。 院中可真熱鬧,春花似錦钩骇、人聲如沸比藻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)银亲。三九已至,卻和暖如春纽匙,著一層夾襖步出監(jiān)牢的瞬間务蝠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工烛缔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馏段,地道東北人轩拨。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像院喜,于是被迫代替她去往敵國(guó)和親亡蓉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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