1.#pragmaonce這個巨集有什麼作用?
為了避免同乙個標頭檔案被包含(include)多次,c/c++中有兩種巨集實現方式:一種是#ifndef方式;另一種是#pragma once方式。
在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別。但兩者仍然有一些細微的區別。
2.兩者的使用方式有何區別?
示例**如下:
複製**
//方式一:
#ifndefsomefile_h
#definesomefile_h
… … // 宣告、定義語句
#endif
//方式二:
#pragmaonce
… … // 宣告、定義語句
複製**
3.兩者各有何特點?
(1)#ifndef
#ifndef的方式受c/c++語言標準支援。它不僅可以保證同乙個檔案不會被包含多次,也能保證內容完全相同的兩個檔案(或者**片段)不會被不小心同時包含。
當然,缺點就是如果不同標頭檔案中的巨集名不小心「撞車」,可能就會導致你看到標頭檔案明明存在,但編譯器卻硬說找不到宣告的狀況——這種情況有時非常讓人鬱悶。
由於編譯器每次都需要開啟標頭檔案才能判定是否有重複定義,因此在編譯大型專案時,ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支援#pragma once的方式。
(2)#pragma once
#pragma once 一般由編譯器提供保證:同乙個檔案不會被包含多次。注意這裡所說的「同乙個檔案」是指物理上的乙個檔案,而不是指內容相同的兩個檔案。
你無法對乙個標頭檔案中的一段**作pragma once宣告,而只能針對檔案。
其好處是,你不必再擔心巨集名衝突了,當然也就不會出現巨集名衝突引發的奇怪問題。大型專案的編譯速度也因此提高了一些。
對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。當然,相比巨集名衝突引發的「找不到宣告」的問題,這種重複包含很容易被發現並修正。
另外,這種方式不支援跨平台!
4.兩者之間有什麼聯絡?
#pragma once 方式產生於#ifndef之後,因此很多人可能甚至沒有聽說過。目前看來#ifndef更受到推崇。因為#ifndef受c/c++語言標準的支援,不受編譯器的任何限制;
而#pragma once方式卻不受一些較老版本的編譯器支援,一些支援了的編譯器又打算去掉它,所以它的相容性可能不夠好。
一般而言,當程式設計師聽到這樣的話,都會選擇#ifndef方式,為了努力使得自己的**「存活」時間更久,通常寧願降低一些編譯效能,這是程式設計師的個性,當然這是題外話啦。
還看到一種用法是把兩者放在一起的:
#pragma once
#ifndefsomefile_h
#definesomefile_h
… … // 宣告、定義語句
#endif
總結:看起來似乎是想兼有兩者的優點。不過只要使用了#ifndef就會有巨集名衝突的危險,也無法避免不支援#pragma once的編譯器報錯,所以混用兩種方法似乎不能帶來更多的好處,倒是會讓一些不熟悉的人感到困惑。
選擇哪種方式,應該在了解兩種方式的情況下,視具體情況而定。只要有乙個合理的約定來避開缺點,我認為哪種方式都是可以接受的。而這個已經不是標準或者編譯器的責任了,應當由程式設計師自己或者小範圍內的開發規範來搞定。
pragma once用法總結
在c c 中,在使用預編譯指令 include的時候,為了防止重複引用造成二義性,通常有兩種方式 第一種是 ifndef指令防止 塊重複引用,比如說 ifndef code block define code block code endif code block第二種就是 pragma once指...
pragma once 用法含意
pragma once 用法含意 pragma指令簡介 在編寫程式的時候,我們經常要用到 pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作.下面介紹了一下該指令的一些常用引數,希望對大家有所幫助 一.message 引數。message 它能夠在編譯資訊輸出窗 口中輸出相應的資訊...
pragma once含義及用法
pragma once是乙個比較常用的c c 雜注,只要在標頭檔案的最開始加入這條雜注,就能夠保證標頭檔案只被編譯一次。pragma once是編譯器相關的,有的編譯器支援,有的編譯器不支援,具體情況請檢視編譯器api文件,不過現在大部分編譯器都有這個雜注了。ifndef,define,endif是...