預(yù)處理知識相關(guān)

預(yù)處理也稱為預(yù)編譯,它為編譯做預(yù)備工作,主要進行代碼文本的替換工作,用于處理#開頭的指令液茎。

1. C/C++頭文件中ifdef/define/endif的作用有哪些?

如果一個項目中存在兩個C文件辞嗡,而這兩個文件都包含同一個頭文件捆等。當(dāng)編譯時,這兩個文件編譯成一個可執(zhí)行文件可能會產(chǎn)生大量的聲明沖突续室。而解決的辦法就是把頭文件的內(nèi)容都放在#ifndef和#endif中栋烤,格式如下:

`#ifndef <_STDIO_H_>
#define <_STDIO_H_>
...
#endif

標識的命名規(guī)則一般是頭文件全大寫,前后加下劃線挺狰,并把文件中的“.”明郭,也變成下劃線,如stdio.h丰泊。

2. #define有哪些缺陷薯定?

由于宏定義在預(yù)處理階段進行,主要做的是字符串替換工作趁耗,所以它存在一些固有的缺陷:

  • 無法進行類型檢查。宏定義是在編譯前進行字符替換疆虚,因為只有編譯時才能檢查類型是否匹配苛败,所以不具有類型檢查功能。
  • 由于優(yōu)先級的不同是喲宏定義可能會存在著副作用径簿。
  • 無法單步調(diào)試
  • 會導(dǎo)致代碼膨脹
  • 在C++中罢屈,宏無法操作類的私有成員。

3. 如何判斷一個變量是有符號數(shù)還是無符號數(shù)篇亭?

  • 方法一:
#define ISUNSIGNED(a) (a>=0 && ~a>=0)
#define ISUNSIGNED_TYPE(type) ((type) - 1 > 0)
  • 方法二:
typedef unsigned type;
int main(){
    unsigned a = 10;
    a = a | (1 << 31);
    if(a > 0)
        printf("signed\n");
    else
        printf("unsigned\n");
}
  • 方法三:
typedef unsigned type;
int main(){
    type a = -1, b = 100;
    if(a - b > 0)
        printf("signed\n");
    else
        printf("unsigned\n");
}

4. 不使用sizeof缠捌,如何計算int占用字節(jié)數(shù),以及結(jié)構(gòu)體內(nèi)存偏移量译蒂?

#define OFFSET(type, field) ((size_t)& ( ((type*)0)->field ) )

ANSI C標準允許值為0的常量強制被轉(zhuǎn)換為任何一種類型的指針曼月,且轉(zhuǎn)換結(jié)果為空指針。對0取(type*)的結(jié)果是將其轉(zhuǎn)化為指針type的空指針柔昼。雖然利用它來訪問field字段是非法的哑芹,但是由于宏替換發(fā)生在編譯前,編譯器僅僅是根據(jù)結(jié)構(gòu)體內(nèi)容布局捕透,計算出field相對于地址為0的指針的偏移量聪姿。

5. 枚舉碴萧、typedef 、const與宏定義有何不同末购?

  • 枚舉可以定義大量相關(guān)常量破喻,具有自動賦值功能,枚舉常量是實體的一種盟榴,擁有作用域曹质、值等特征。此外曹货,枚舉常量在編譯階段確定其值咆繁,在編譯器中一般可以調(diào)試枚舉常量,這些特征都是宏定義所不具備的顶籽。

  • typedef可以為對象(基本類型或自定義類型)取一個別名玩般,以增加可讀性。其具有類型檢查功能礼饱,以及作用域坏为。宏定義只是簡單替換,不具備上述特點镊绪。值得注意的是匀伏,typedef和宏定義在處理指針時,區(qū)別較大蝴韭。

  • const常量具有數(shù)據(jù)類型够颠,存在于程序的數(shù)據(jù)段,可以被傳遞調(diào)用榄鉴。編譯器可以對const常量進行安全檢查履磨。因此,很多IDE支持const常量庆尘,而不支持宏定義剃诅。

6. 宏定義與內(nèi)聯(lián)函數(shù)有什么區(qū)別?

宏代碼本身不是函數(shù)驶忌,但是用起來卻和函數(shù)很像矛辕,預(yù)處理器用復(fù)制宏代碼的方式代替函數(shù)調(diào)用,省去了參數(shù)壓棧付魔、生成匯編語言的CALL調(diào)用聊品,返回參數(shù)、執(zhí)行return等過程几苍,從而提高了速度杨刨。

內(nèi)聯(lián)函數(shù)是代碼被插入到調(diào)用者代碼處的函數(shù)。內(nèi)聯(lián)函數(shù)也不是萬能的擦剑,只適用于函數(shù)體內(nèi)代碼簡單的函數(shù)使用妖胀,不包含復(fù)雜的結(jié)構(gòu)控制語句芥颈,并且內(nèi)聯(lián)函數(shù)本身不能直接調(diào)用遞歸函數(shù)。

兩者的區(qū)別在于:

  • 宏定義是在預(yù)處理階段進行代碼替換的赚抡,而內(nèi)聯(lián)函數(shù)是在編譯階段插入代碼
  • 宏定義沒有類型檢查爬坑,而內(nèi)聯(lián)函數(shù)有類型檢查。
引申:內(nèi)聯(lián)函數(shù)與普通函數(shù)的區(qū)別涂臣?

C++語言中的內(nèi)聯(lián)函數(shù)與普通函數(shù)相同盾计,但是編譯器會在每處調(diào)用內(nèi)聯(lián)函數(shù)的地方將內(nèi)聯(lián)函數(shù)展開,這樣既避免了函數(shù)調(diào)用的開銷赁遗,又避免了宏機制的缺陷署辉。在N處調(diào)用了內(nèi)聯(lián)函數(shù),則此函數(shù)就會對該段代碼展開N次岩四。如果內(nèi)聯(lián)函數(shù)體過大哭尝,編譯器則會放棄內(nèi)聯(lián)方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剖煌,一起剝皮案震驚了整個濱河市材鹦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耕姊,老刑警劉巖桶唐,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茉兰,居然都是意外死亡尤泽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門规脸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坯约,“玉大人,你說我怎么就攤上這事燃辖」淼辏” “怎么了网棍?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵黔龟,是天一觀的道長。 經(jīng)常有香客問我滥玷,道長氏身,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任惑畴,我火速辦了婚禮蛋欣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘如贷。我一直安慰自己陷虎,他們只是感情好到踏,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尚猿,像睡著了一般窝稿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凿掂,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天伴榔,我揣著相機與錄音,去河邊找鬼庄萎。 笑死踪少,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的糠涛。 我是一名探鬼主播援奢,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脱羡!你這毒婦竟也來了萝究?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锉罐,失蹤者是張志新(化名)和其女友劉穎帆竹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脓规,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡栽连,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侨舆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秒紧。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挨下,靈堂內(nèi)的尸體忽然破棺而出熔恢,到底是詐尸還是另有隱情,我是刑警寧澤臭笆,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布叙淌,位于F島的核電站,受9級特大地震影響愁铺,放射性物質(zhì)發(fā)生泄漏鹰霍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一茵乱、第九天 我趴在偏房一處隱蔽的房頂上張望茂洒。 院中可真熱鬧,春花似錦瓶竭、人聲如沸督勺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽智哀。三九已至堵未,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盏触,已是汗流浹背渗蟹。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赞辩,地道東北人蛾派。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓读第,卻偏偏與公主長得像们妥,于是被迫代替她去往敵國和親魏铅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,519評論 1 51
  • 目錄 一.預(yù)處理的工作方式... 3 1.1.預(yù)處理的功能... 3 1.2預(yù)處理的工作方式... 3 二.預(yù)處理...
    朱森閱讀 1,377評論 0 2
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別糟需? C沒有Protection行為...
    阿面a閱讀 7,663評論 0 10
  • #幸福是需要修出來的~每天進步1%~幸福實修09班~張媛 20170807(22/30)09班 【幸福三朵玫瑰】 ...
    自在如我是閱讀 166評論 0 1
  • 說句老實話洲押,我身邊有很多朋友都有“耍流氓”的習(xí)慣武花。當(dāng)然這個「耍流氓」”不是真的“耍流氓”。 “耍流氓”也是要分位2...
    Haley少玢閱讀 1,095評論 0 1