目的:為了避免同乙個檔案被include多次
同乙個檔案被include多次的危害:
(1)防止重複定義的錯誤;
(2)如果這個標頭檔案變化,那麼所有include這個檔案的原始檔都需要重新編譯,即使沒有去使用裡面的任何內容
避免措施:
(1)標頭檔案加#pragma once
(2)標頭檔案加#ifndef 巨集名 #define 巨集名 #endif
兩者區別:
(1)#ifndef和#pragma oncr都發生在預處理階段,#ifndef的方式依賴於巨集名字不能衝突,這不光可以保證同乙個檔案不會被包含多次,也能保證內容完全相同的兩個檔案不會被不小心同時包含。當然,缺點就是如果不同標頭檔案的巨集名不小心「撞車
」。 (
2)#ifndef
是c/c++
語言特性,而
#pragma once
是編譯器提供的指令,同乙個檔案不會被包含多次。注意這裡所說的「同乙個檔案」是指物理上的乙個檔案,而不是指內容相同的兩個檔案。帶來的好處是,你不必再費勁想個巨集名了,當然也就不會出現巨集名碰撞引發的奇怪問題。對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。 (
3)#pragma
依賴於編譯器,所以一些老的編譯器不提供(比如說
vc6之前),而
#ifndef
可移植性非常好。
其他1:
#if _msc_ver > 1000
#pragma once
#endif
這是微軟的預編譯控制,在_msc_ver較小時,它對一些東西的支援和新版不同,_msc_ver分解如下:
ms:microsoft(微軟)的簡寫 ;c:msc就是microsoft出的c編譯器; ver:version(版本)的簡寫。
全部加在一起就是:microsoft的c編譯器的版本。一般#pragma once在版本》1000時都支援。
其他2:在預處理期間,會保留所有的#pragma
編譯器指令,因為編譯器需要使用它們。比如說結構體對齊方式。
其他3:c++11中引入了_pragma操作符
#pragma once 和 _pragma("once")效果類似,
但是前者是預處理的指令,後者是操作符,可以用在一些巨集中。
pragma once與 ifndef的區別
為了避免同乙個檔案被include多次 1 ifndef方式 2 pragma once方式 在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。方式一 ifndef somefile h define somefile h 一些宣告語句 endif 方式二 pr...
pragma once與 ifndef的區別
為了避免同乙個檔案被include多次 1 ifndef 方式2 pragma once方式 在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。方式一 ifndef somefile h define somefile h 一些宣告語句 endif 方式二 pr...
pragma once與 ifndef的區別
pragma once與 ifndef的區別 為了避免同乙個檔案被include多次 1 ifndef方式 2 pragma once方式 在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。方式一 ifndef somefile h define somefil...