為了避免同一個(gè)文件被include多次
1#ifndef方式
2#pragma once方式
在能夠支持這兩種方式的編譯器上,二者并沒(méi)有太大的區(qū)別,但是兩者仍然還是有一些細(xì)微的區(qū)別斋配。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語(yǔ)句
#endif
方式二:
#pragma once
... ... // 一些聲明語(yǔ)句
#ifndef的方式依賴于宏名字不能沖突,這不光可以保證同一個(gè)文件不會(huì)被包含多次盗似,也能保證內(nèi)容完全相同的兩個(gè)文件不會(huì)被不小心同時(shí)包含俺亮。當(dāng)然,缺點(diǎn)就是如果不同頭文件的宏名不小心“撞車”罩润,可能就會(huì)導(dǎo)致頭文件明明存在玖翅,編譯器卻硬說(shuō)找不到聲明的狀況
#pragma once則由編譯器提供保證:同一個(gè)文件不會(huì)被包含多次。注意這里所說(shuō)的“同一個(gè)文件”是指物理上的一個(gè)文件割以,而不是指內(nèi)容相同的兩個(gè)文件金度。帶來(lái)的好處是,你不必再費(fèi)勁想個(gè)宏名了严沥,當(dāng)然也就不會(huì)出現(xiàn)宏名碰撞引發(fā)的奇怪問(wèn)題猜极。對(duì)應(yīng)的缺點(diǎn)就是如果某個(gè)頭文件有多份拷貝,本方法不能保證他們不被重復(fù)包含消玄。當(dāng)然跟伏,相比宏名碰撞引發(fā)的“找不到聲明”的問(wèn)題,重復(fù)包含更容易被發(fā)現(xiàn)并修正翩瓜。
由于編譯器每次都需要打開頭文件才能判定是否有重復(fù)定義受扳,因此在編譯大型項(xiàng)目時(shí),ifndef會(huì)使得編譯時(shí)間相對(duì)較長(zhǎng)奥溺,因此一些編譯器逐漸開始支持#pragma once的方式辞色。
方式一由語(yǔ)言支持所以移植性好,方式二 可以避免名字沖突
總結(jié)
·性能上的區(qū)別
使用 #ifndef 的話,編譯器每次看到#include這個(gè)文件都需要讀入文件相满,解析代碼层亿;
而使用#pragma once 編譯器根本不會(huì)重復(fù)打開文件, 大大提高了效率立美。
·編碼風(fēng)格上的區(qū)別
使用#pragma once的代碼簡(jiǎn)潔匿又,重要的是它避免了頭文件標(biāo)號(hào)(如_myheader_h_)的 重定義或者 #endif 包含范圍錯(cuò)誤的情況。
·語(yǔ)意上的區(qū)別
#pragma once是針對(duì)文件的建蹄,它告訴編譯器碌更,本文件只編譯一次。
#ifndef…#define…#endif 只是針對(duì)文件中的某一個(gè)標(biāo)號(hào)而言的洞慎,它能防止三個(gè)指令間包含的內(nèi)容的重復(fù)性處理痛单。就這一點(diǎn)而言,后者更靈活劲腿。
可移植性方面
#pragma once是微軟的開發(fā)工具中所使用的旭绒,如 msvc 等工具可以完好的支持;
#ifndef #define #endif是C++標(biāo)準(zhǔn)里面的一部分焦人,對(duì)于任何完好支持c/c++的編譯器都能使用挥吵。顯而易見,后者的可移植性更高花椭。