pragma once與 ifndef的區別

2021-09-25 12:45:08 字數 1342 閱讀 3778

目的:為了避免同乙個檔案被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...