1 #ifndef方式
2 #pragma once方式
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif
方式二:
#pragma once
... ... // 一些声明语句
#ifndef的方式依賴於宏名字不能沖突,這不光可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件不會被不小心同時包含。當然,缺點就是如果不同頭文件的宏名不小心“撞車”,可能就會導致頭文件明明存在,編譯器卻硬說找不到聲明的狀況
#pragma once則由編譯器提供保證:同一個文件不會被包含多次。注意這裏所說的“同一個文件”是指物理上的一個文件,而不是指內容相同的兩個文件。帶來的好處 是,你不必再費勁想個宏名了,當然也就不會出現宏名碰撞引發的奇怪問題。對應的缺點就是如果某個頭文件有多份拷貝,本方法不能保證他們不被重复包含。當 然,相比宏名碰撞引發的“找不到聲明”的問題,重复包含更容易被發現並修正。
方式一由語言支持所以移植性好,方式二 可以避免名字沖突
三、相比之下
1.性能上的區別
使用 #ifndef 的話,編譯器每次看到 #include 這個文件都需要讀入文件,解析代碼; 而使用 #pragma once 編譯器根本不會重复打開文件, 大大提高了效率。
2.編碼風格上的區別
使用 #pragma once 的代碼簡潔,顯然比 #ifndef 要簡短許多,重要的是它避免了頭文件標號(如 __myheader_h__ )的重定義或者 #endif 包含範圍錯誤的情況。
3.語意上的區別
#pragma once 是針對文件的,它告訴編譯器,本文件只編譯一次。
#ifndef #define #endif 只是針對文件中的某一個標號而言的,它能用於防止三個指令間所包含內容的重复性處理。就這一點而言,後者更靈活。
4.可移植性方面
#pragma once 是微軟的開發工具中所使用的,如 .net,vc6 等工具可以完好的支持;
#ifndef #define #endif 是標准裏面的一部分,所以對於任何完好支持 C/C++ 的編譯器都能使用。顯而易見,後者的可移植性更高。
細節資料可參考Wiki
https://zh.wikipedia.org/wiki/Pragma_once
https://zh.wikipedia.org/wiki/Include%E9%98%B2%E7%AF%84
其它參考資料
http://rritw.com/a/bianchengyuyan/C__/20121216/272805.html