#pragma once與#ifndef兩種防止頭文件二次編譯的區(qū)別

在最開(kāi)始接觸到C語(yǔ)言的時(shí)候黔夭,看到很多大牛們寫的代碼里面就有#ifndef? #define #endif 這三條語(yǔ)句,當(dāng)時(shí)不明白什么意思羽嫡,慢慢的后來(lái)自己也開(kāi)始用了本姥,也知道了他們合起來(lái)使用時(shí)為了防止頭文件被二次編譯,因?yàn)槲覀冊(cè)?jīng)寫代碼的過(guò)程中一定遇到過(guò)<.......重復(fù)定義或是重復(fù)包含>等類似的錯(cuò)誤吧杭棵。

到了學(xué)習(xí)C++的時(shí)候婚惫,我們老師給我們看他的代碼的時(shí)候發(fā)現(xiàn)他的頭文件里用的是#pragma once,就奇怪這是什么呢颜屠?然后私下百度了后才知道辰妙,這也是防止頭文件二次編譯的,然后就開(kāi)始用#pragma once了甫窟,這一用就是一個(gè)學(xué)期了密浑,后來(lái)發(fā)現(xiàn)用著很好,再也沒(méi)有重復(fù)編譯或是重復(fù)包含的錯(cuò)誤了粗井,當(dāng)時(shí)寫C++代碼的時(shí)候習(xí)慣了單個(gè)類放在獨(dú)立的頭文件里尔破,這樣子好糾錯(cuò),也好擴(kuò)展浇衬,調(diào)理更清晰懒构。

最近一段時(shí)間為了給學(xué)弟學(xué)妹們講C語(yǔ)言的知識(shí),又回過(guò)頭來(lái)看宏定義的方法耘擂。就想寫這么一篇博客來(lái)說(shuō)明一下這兩者之間的區(qū)別胆剧,過(guò)程中也百度了很多,也看了很多別人是怎么寫的醉冤,怎么認(rèn)識(shí)的秩霍。這里面肯定有他人文章中的影子,但是這絕對(duì)不是簡(jiǎn)單的復(fù)制粘貼蚁阳,而是自己看了那么多之后的思考铃绒,總結(jié)之作。

#ifndef這種是最早期使用的方法螺捐,是基于語(yǔ)言的宏定義名字不能沖突的前提下的颠悬。這種方法不僅能保證同一個(gè)頭文件不會(huì)被包含兩次,也可以保證內(nèi)容完全相同的兩個(gè)文件也只能被包含一次定血。但是他優(yōu)缺點(diǎn)赔癌,就是你的#ifndef 后面跟的宏名字和你程序中的其他宏名字發(fā)生了”撞車“,那么會(huì)出現(xiàn)以下兩種后果

第一種:file1頭文件中有一個(gè)宏

//file1.h

#define BOOK_H ? //宏名

現(xiàn)在又有一個(gè)文件 book.h 里面使用了宏定義方式防止頭文件二次編譯

#ifndef BOOK_H

#define BOOK_H

// ?program codes

#endif

下面是你的主函數(shù)所在文件內(nèi)容

#include"fil1.h"

#include"book.h" ? //這兩個(gè)都是你自己的頭文件

#include<........>

..................

預(yù)編譯階段把file1文件展開(kāi)澜沟,就得到了宏 BOOK_H届榄,在處理book.h文件時(shí)就發(fā)現(xiàn)BOOK_H這個(gè)宏已經(jīng)存在了,就不會(huì)包含book.h頭文件了倔喂,這就是弊端所在了铝条。

第二種就是:

兩者順序反過(guò)來(lái)了靖苇,弊端類似。

#pragma once這種方式班缰,是微軟編譯器獨(dú)有的贤壁,也是后來(lái)才有的,所以知道的人并不是很多埠忘,用的人也不是很多脾拆,因?yàn)樗恢С挚缙脚_(tái)。如果你想寫跨平臺(tái)的代碼莹妒,最好使用上一種名船。這是一種由編譯器提供支持的方式,防止同一文件的二次編譯旨怠,這里的同一文件指的是物理文件渠驼。

他也是有弊端的:

假如你的某一個(gè)頭文件有多份拷貝,那么這些文件雖然在邏輯上都是一樣的鉴腻,但是在物理上他們卻是不同的迷扇,所以當(dāng)你把這些文件包含的時(shí)候,就會(huì)發(fā)現(xiàn)真的都包含進(jìn)來(lái)了爽哎,然后就是編譯錯(cuò)誤了蜓席。還有,當(dāng)物理上的同一文件被嵌套包含的時(shí)候课锌,使用第一種方法預(yù)處理會(huì)每一次打開(kāi)該文件做判斷的厨内,但是第二種方法則不會(huì),所以在此#pragma once 會(huì)更快些渺贤。下面舉例說(shuō)明

// Test1.h

#ifndefine ?TEST1_H

#defineTEST1_H

...

#endif

// Test2.h

#pragma once

...

// Test.cpp

#include "Test1.h"????? // line 1

#include "Test1.h"????? // line 2

#include "Test2.h"????? // line 3

#include "Test2.h"????? // line 4 這里的Test2.h是同一物理文件

預(yù)處理器在執(zhí)行這四句的時(shí)候癣亚,先打開(kāi)Test1.h然后發(fā)現(xiàn)里面的宏TEST1_H沒(méi)有被定義,所以會(huì)包含這個(gè)文件玻孟,第二句的時(shí)候黍翎,同樣還是會(huì)打開(kāi)Test1.h的發(fā)現(xiàn)宏已定義,就不包含該文件了匣掸。第三句時(shí),發(fā)現(xiàn)之前沒(méi)有包含Test2.h則會(huì)把該文件包含進(jìn)來(lái)碰酝,執(zhí)行第四句的時(shí)候,發(fā)現(xiàn)該文件已經(jīng)被包含了铛嘱,所以不用打開(kāi)就直接跳過(guò)了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纹磺,一起剝皮案震驚了整個(gè)濱河市爽航,隨后出現(xiàn)的幾起案子讥珍,更是在濱河造成了極大的恐慌历极,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氏义,死亡現(xiàn)場(chǎng)離奇詭異邻邮,居然都是意外死亡情萤,警方通過(guò)查閱死者的電腦和手機(jī)鸭蛙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門娶视,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事寒锚。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵千诬,是天一觀的道長(zhǎng)莫辨。 經(jīng)常有香客問(wèn)我盘榨,道長(zhǎng),這世上最難降的妖魔是什么蟆融? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任草巡,我火速辦了婚禮,結(jié)果婚禮上型酥,老公的妹妹穿的比我還像新娘山憨。我一直安慰自己,他們只是感情好冕末,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布萍歉。 她就那樣靜靜地躺著侣颂,像睡著了一般档桃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上憔晒,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天藻肄,我揣著相機(jī)與錄音蔑舞,去河邊找鬼。 笑死嘹屯,一個(gè)胖子當(dāng)著我的面吹牛攻询,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播州弟,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钧栖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了婆翔?” 一聲冷哼從身側(cè)響起拯杠,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啃奴,沒(méi)想到半個(gè)月后潭陪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡最蕾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年依溯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘟则。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黎炉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醋拧,到底是詐尸還是另有隱情拜隧,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布趁仙,位于F島的核電站洪添,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雀费。R本人自食惡果不足惜干奢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盏袄。 院中可真熱鬧忿峻,春花似錦、人聲如沸辕羽。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刁愿。三九已至绰寞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滤钱。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工觉壶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人件缸。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓铜靶,卻偏偏與公主長(zhǎng)得像雹顺,于是被迫代替她去往敵國(guó)和親咱圆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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