在 C 中防止標頭檔案被重複包含時為什麼同時使用 ifndef 和 pragma once?

時間 2021-05-13 05:04:01

1樓:吉林小伙

vc6 你新增的class標頭檔案就會自動加上ifndef和pragma once,如 @SuperSodaSea 說得一樣,的確是為了相容性。後來的ide就直接拋棄ifndef了,畢竟分析它也是要耗時間的。gcc也有對ifndef的優化。

實際上,編譯器對頭檔案的處理是有優化的,並不是你include了就會實實在在的走系統呼叫open一次,所以從效能上來說,應該沒啥差別。pragma once還有乙個好處,就是不用擔心ifndef重名的問題

2樓:d41d8c

反對反對使用了ifndef就不需要pragma once的說法。

現代編譯器(甚至包括較新的 MSVC)能夠識別作為 include guard 的 ifndef ,在發現 ifndef 覆蓋了檔案中的所有 token 時避免重複讀取檔案。因此在現代編譯器上 ifndef 本身的編譯速度就足夠快,不需要 pragma once。

3樓:SuperSodaSea

反對使用了ifndef就不需要pragma once的說法。

現在主流的編譯器都有對progma once的支援,並可由此提高編譯速度(使用pragma once的編譯速度比ifndef的寫法快),加上ifndef是為了確保相容性,可以在支援和不支援pragma once的編譯器。因此兩種都使用可以在提高編譯速度的前提下保證相容性。

4樓:

#pragma once是屬於廣泛應用卻沒有被納入標準的東西, 個人認為是極其好用的, 因為用#ifndef需要考慮命名問題, 如果是多個檔案層次的編譯結構, 容易撞車. (num/img和resource/img).

所以如果你在PC上開發, 妥妥用#pragma once吧. 然後實在是不相容, 再用指令碼統一處理標頭檔案新增#ifndef.

5樓:Pluto Hades

#pragma once是微軟的最早開始用的,並不是所有編譯器都支援,不過現在的主流編譯器一般都支援

支援的編譯器可以參考如下鏈結

pragma once

它的好處是,它一般寫在第一行,支援的編譯器預處理期間可以很快掃瞄並識別,效率上略高一點。

#ifndef格式的,基本上通用於所有編譯器,相容性最好。但是,如果多次包含同乙個檔案的預處理效率略低

因此,就出現了同時使用兩種的情況,兼顧效率和相容性。

c 標頭檔案包含?

San Cheung 既然是c 就簡單粗暴直接用namespace包裹吧。PS 不建議你使用這種全域性變數的組織方式,這也算是c c 的乙個大坑。 dyntkj 感覺好像在哪本書裡見過 如果沒猜錯的話看下去就有答案了。首先,標頭檔案裡一般不能定義變數。a.h ifndef A H 防止重複包含 de...

C 類和其友元類的標頭檔案該怎樣相互包含

宣告的時候不用包含所宣告類的標頭檔案,所以友元宣告直接宣告就好了,否則會出現互相包含,造成很大的麻煩。include只是把多個檔案複製在一起,所以只需要乙個宣告,他們最終還是會遇到的。 李白 看到這個問題,說一下我的理解.宣告友元的那個類我們稱為A,由於它需要搜尋另乙個類B的函式名形參等等資訊,因此...

C 中的模板類宣告標頭檔案和實現檔案分離後,如何能實現正常編譯?

孫嘉成 把模板的宣告放在.h檔案中,實現放在.cpp檔案中,在main.cpp檔案中 include XX.cpp 同樣可以正常使用模板函式,但是這並不能實現您說的隱藏實現,只是表面上將宣告和實現分離了,沒什麼實際用處,只是看著好看一些,不建議使用。 zaoru 1.包含模型 常規寫法將實現寫在標頭...