在看各種源碼的時(shí)候牡彻,經(jīng)常在頭文件中看到這樣的寫(xiě)法
#ifndef __HEAD__
#define __HEAD__
......
#endif
開(kāi)始我也不知道為什么要這么寫(xiě),后來(lái)看得多了,就查了查庄吼,發(fā)現(xiàn)它是對(duì)頭文件的防衛(wèi)式聲明缎除。
一般來(lái)說(shuō),在寫(xiě)c++代碼的時(shí)候总寻,每個(gè)cpp都會(huì)對(duì)應(yīng)一個(gè)頭文件(.h文件)器罐,當(dāng)然也可能由于文件內(nèi)容過(guò)于簡(jiǎn)單,沒(méi)有cpp文件渐行,只有頭文件轰坊。我們的頭文件可能是專門為某個(gè)cpp文件寫(xiě)的,也可能是公共的祟印,為多個(gè)cpp文件服務(wù)肴沫。這時(shí)候我們就需要考慮好,在代碼中不要包含多次頭文件蕴忆,否則的話就會(huì)報(bào)錯(cuò)(重復(fù)聲明了相同的變量/函數(shù))颤芬。文件比較少的時(shí)候還可以分辨出來(lái)哪些頭文件多次聲明了,但是當(dāng)有很多的文件時(shí)套鹅,再區(qū)分頭文件是否聲明了1次就很困難了站蝠,因此就出現(xiàn)了頭文件的防衛(wèi)式聲明。
只要頭文件有了上面的三行代碼卓鹿,你就可以在任意用到該頭文件的地方include該頭文件沉衣。如果是第一次include,由于沒(méi)有定義__HEAD__,因此就會(huì)首次定義减牺,當(dāng)?shù)诙蝘nclude該頭文件時(shí),由于已經(jīng)定義了__HEAD__存谎,所以就直接跳過(guò)了拔疚,不會(huì)造成重復(fù)聲明,而且可以繼續(xù)使用該頭文件中的變量/函數(shù)既荚。
建議:為了不必要的麻煩稚失,最好在每個(gè)頭文件上加上這樣的防衛(wèi)式聲明。即使現(xiàn)在你只有一個(gè)cpp使用該頭文件恰聘,萬(wàn)一之后再有別的cpp使用該頭文件嘞句各。
PS:防衛(wèi)式聲明一般這樣寫(xiě):__(2個(gè)下劃線,不是1個(gè))+頭文件名的大寫(xiě)(不包括.h)+__(2個(gè)下劃線晴叨,不是1個(gè))凿宾,例如頭文件為head.h時(shí),就使用__HEAD__兼蕊,這是為了防止重復(fù)初厚。