為了避免同一個(gè)文件被include多次
1 #ifndef方式
2 #pragma once方式
在能夠支持這兩種方式的編譯器上,二者并沒(méi)有太大的區(qū)別,但是兩者仍然還是有一些細(xì)微的區(qū)別。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語(yǔ)句
#endif
方式二:
#pragma once
... ... // 一些聲明語(yǔ)句
#ifndef的方式依賴(lài)于宏名字不能沖突,這不光可以保證同一個(gè)文件不會(huì)被包含多次,也能保證內(nèi)容完全相同的兩個(gè)文件不會(huì)被不小心同時(shí)包含。當(dāng)然,缺點(diǎn)就是如果不同頭文件的宏名不小心“撞車(chē)”,可能就會(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)并修正。
方式一由語(yǔ)言支持所以移植性好,方式二 可以避免名字沖突。
一般可以這樣處理:
#infndef XX
#define XX
#if _MSC_VER > 1000
#pragma once
#endif
.
.
#endif
注意: _MSC_VER 是出于版本兼容性考慮,定義
Defines the compiler version. Defined as 1200 for Microsoft Visual C++ 6.0. Always defined.