1、相同點
二者的共同點都是爲了不同一個文件被 include 屢次,可是 #ifndef #define #endif 不僅有這個做用。
在可以支持這兩種方式的編譯器上,兩者並無太大的區別,可是二者仍然仍是有一些細微的區別。
2、收集理解
1.#pragma once
這個是編譯器相關,就是說在這個編譯系統上能用,在其餘編譯系統不必定行,即移植性差。不過如今基本上已是每一個編譯器都有這個定義了。
此方式由編譯器保證同一個文件不會被包含屢次。注意:這裏所說的「同一個文件」是指物理上的一個文件,而不是指內容相同的兩個文件。因而沒必要再費勁想個宏名了,固然也就能夠避免宏的名字衝突問題了。
缺點:若是某個頭文件有多份拷貝,本方法不能保證他們不被重複包含。
舉例:在通常的 MFC 程序中能夠看到
#if !defined(AFX_STDAFX_H__32722022_E372_4A5C_8EC5_BBB243CEDE1D__INCLUDED_)
#define AFX_STDAFX_H__32722022_E372_4A5C_8EC5_BBB243CEDE1D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TODO: reference additional headers your program requires here
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__32722022_E372_4A5C_8EC5_BBB243CEDE1D__INCLUDED_)
其中 _MSC_VER 分解以下:
MS:Microsoft(微軟)的簡寫
C:MSC 就是 Microsoft 出的 C 編譯器
VER:Version(版本)的簡寫
#if _MSC_VER > 1000 的意思就是若是編譯器版本高於 1000(VC++5.0)
能夠看到:在 _MSC_VER 小於 1000 時,它對 #pragma once 是不支持的。
2.#ifndef #define #endif
該方法與 C++ 語言相關,是 C++ 語言中的宏定義,經過宏定義避免文件屢次編譯。因此在全部支持 C++ 語言的編譯器上都是有效的。若是寫的程序要跨平臺,最好使用這種方式。該方式因爲是 C++ 語言自己支持,因此移植性好。它依賴於宏名字不能衝突,這不光能夠保證同一個文件不會被包含屢次,也能保證內容徹底相同的兩個文件不會被不當心同時包含。另外,爲了保證不一樣頭文件中的宏名不衝突,故採起相似於_ABC_H_的取名方式。其中,abc.h爲當前頭文件名。
舉例:經常在一些頭中能夠看到
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
// 一些聲明語句
#endif
缺點:若是不一樣頭文件的宏名不當心「撞車」,可能就會致使頭文件明明存在,編譯器卻硬說找不到聲明的情況。但這個缺點偏偏是咱們能夠利用的優勢,#ifndef 方式能夠經過前面介紹的特殊的宏的取名方式來避免名稱衝突問題,因而其缺點也就不復存在了,進而 #ifndef 方式就更經常使用了。
3、相比之下
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++ 的編譯器都能使用。顯而易見,後者的可移植性更高。
4、引用通告
在總結的過程當中,看了一些網頁,也引用到其中的一些內容,現給出連接,這裏僅供本人學習,謝謝引用到的做者。
http://www.dnbcw.com/biancheng/c/dtox45497.html
http://zhidao.baidu.com/question/154510671.html?fr=ala0
http://zxjgoodboy.blog.sohu.com/87503141.html
http://hi.baidu.com/huqingshuye/blog/item/807a7c006f4a70044afb511a.html