#pragma once 與 #ifndef 的作用
(1)在C/C++中,在使用預編譯指令#include的時候,為了防止重復參考造成二義性,
(2)在能夠支持這兩種方式的編譯器上,二者并沒有太大的區別,但是兩者仍然還是有一些細微的區別,
#pragma once 與 #ifndef 的用法
#pragma once
#pragma once
#ifndef
#ifndef _CODE_BLOCK
#define _CODE_BLOCK
// code
...
#endif // _CODE_BLOCK
#pragma once 與 #ifndef 兩者各有何特點
#pragma once
在C/C++中,#pragma once是一個非標準但是被廣泛支持的方式,
介紹:#pragma once 一般由編譯器提供保證:同一個檔案不會被包含多次,注意這里所說的“同一個檔案”是指物理上的一個檔案,而不是指內容相同的兩個檔案,你無法對一個頭檔案中的一段代碼作pragma once宣告,而只能針對檔案,
優點:你不必再擔心宏名沖突了,當然也就不會出現宏名沖突引發的奇怪問題,大型專案的編譯速度也因此提高了一些,
缺點:如果某個頭檔案有多份拷貝,本方法不能保證他們不被重復包含,當然,相比宏名沖突引發的“找不到宣告”的問題,這種 重復包含很容易被發現并修正,另外,這種方式不支持跨平臺!
#ifndef
介紹:#ifndef的方式受C/C++語言標準支持, ,也是比較常用的方式,
優點:它不僅可以保證同一個檔案不會被包含多次,也能保證內容完全相同的兩個檔案(或者代碼片段)不會被不小心同時包含,
缺點:就是如果不同頭檔案中的宏名不小心“撞車”,可能就會導致你看到頭檔案明明存在,但編譯器卻硬說找不到宣告的狀況——這種情況有時非常讓人郁悶, 由于編譯器每次都需要打開頭檔案才能判定是否有重復定義,因此在編譯大型專案時,ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支持#pragma once的方式,(Visual Studio 2017新建頭檔案會自帶#pragma once指令),
兩者之間的聯系
(1)#pragma once 方式產生于 #ifndef 之后,因此很多人可能甚至沒有聽說過,目前看來#ifndef更受到推崇,因為#ifndef受C/C++語言標準的支持,不受編譯器的任何限制;而#pragma once方式卻不受一些較老版本的編譯器支持 (如GCC 3.4版本之前不支持#pragmaonce) ,一些支持了的編譯器又打算去掉它,所以它的兼容性可能不夠好,
(2) #ifndef可以針對一個檔案中的部分代碼,而#pragma once只能針對整個檔案,
總結
相對而言,#ifndef 更加靈活,兼容性好,移植性好 ,而 #pragma once 操作簡單,可以避免名字沖突,效率高,
看起來似乎是想兼有兩者的優點,不過只要使用了 #ifndef 就會有宏名沖突的危險,也無法避免不支持#pragma once的編譯器報錯,所以混用兩種方法似乎不能帶來更多的好處,倒是會讓一些不熟悉的人感到困惑,
選擇哪種方式,應該在了解兩種方式的情況下,視具體情況而定,只要有一個合理的約定來避開缺點,我認為哪種方式都是可以接受的,而這個已經不是標準或者編譯器的責任了,應當由程式員自己或者小范圍內的開發規范來搞定,
最后
一般而言,當程式員聽到這樣的話,都會選擇 #ifndef 方式,為了努力使得自己的代碼“存活”時間更久,通常寧愿降低一些編譯性能,這是程式員的個性,當然這是題外話啦,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168213.html
標籤:其他
上一篇:C++ new 運算子 用法總結
