為了避免同一個文件被include多次
1#ifndef方式
2#pragma once方式
在能夠支持這兩種方式的編譯器上,二者并沒有太大的區(qū)別,但是兩者仍然還是有一些細微的區(qū)別。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語句
#endif
方式二:
#pragma once
... ... // 一些聲明語句
#ifndef的方式依賴于宏名字不能沖突,這不光可以保證同一個文件不會被包含多次,也能保證內(nèi)容完全相同的兩個文件不會被不小心同時包含。當然,缺點就是如果不同頭文件的宏名不小心“撞車”,可能就會導(dǎo)致頭文件明明存在,編譯器卻硬說找不到聲明的狀況
#pragma once則由編譯器提供保證:同一個文件不會被包含多次。注意這里所說的“同一個文件”是指物理上的一個文件,而不是指內(nèi)容相同的兩個文件。帶來的好處是,你不必再費勁想個宏名了,當然也就不會出現(xiàn)宏名碰撞引發(fā)的奇怪問題。對應(yīng)的缺點就是如果某個頭文件有多份拷貝,本方法不能保證他們不被重復(fù)包含。當然,相比宏名碰撞引發(fā)的“找不到聲明”的問題,重復(fù)包含更容易被發(fā)現(xiàn)并修正。
由于編譯器每次都需要打開頭文件才能判定是否有重復(fù)定義,因此在編譯大型項目時,ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支持#pragma once的方式。
方式一由語言支持所以移植性好,方式二 可以避免名字沖突
總結(jié)
·性能上的區(qū)別
使用 #ifndef 的話,編譯器每次看到#include這個文件都需要讀入文件,解析代碼;
而使用#pragma once 編譯器根本不會重復(fù)打開文件, 大大提高了效率。
·編碼風格上的區(qū)別
使用#pragma once的代碼簡潔,重要的是它避免了頭文件標號(如_myheader_h_)的 重定義或者 #endif 包含范圍錯誤的情況。
·語意上的區(qū)別
#pragma once是針對文件的,它告訴編譯器,本文件只編譯一次。
#ifndef…#define…#endif 只是針對文件中的某一個標號而言的,它能防止三個指令間包含的內(nèi)容的重復(fù)性處理。就這一點而言,后者更靈活。
可移植性方面
#pragma once是微軟的開發(fā)工具中所使用的,如 msvc 等工具可以完好的支持;
#ifndef #define #endif是C++標準里面的一部分,對于任何完好支持c/c++的編譯器都能使用。顯而易見,后者的可移植性更高。