pragma once和 ifndef的區別

2021-07-13 03:08:21 字數 2015 閱讀 4020

#pragma once 和 #ifndef的區別

#pragma once和#ifdef都是可以避免同乙個檔案被include多次。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。

1. #pragma once方式

這個是編譯器相關,就是說在這個編譯系統上能用,但是在其他編譯系統,不一定行,也就是說移植型差。不過現在基本上已經是每個編譯器都有這個定義了。編譯器提供保證,同乙個檔案不會被包含多次。注意這裡所說的「同乙個檔案」是指物理上的乙個檔案,而不是指內容相同的兩個檔案。於是不必再費勁想個巨集名了,當然也就可以避免巨集的名字衝突問題了。缺點:如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。

// 看看vc自帶的stdarg.h標頭檔案中是怎麼使用#pragma once的 

// 畢竟微軟的東西權威嘛 - -|| 

//  

#if     _msc_ver > 1000 

#pragma once 

#endif  

#ifndef _inc_stdarg 

#define _inc_stdarg  

#include #define va_start _crt_va_start 

#define va_arg _crt_va_arg 

#define va_end _crt_va_end  

#endif  /* _inc_stdarg */

此時只需要注意以下三行**:

#if     _msc_ver > 1000 

#pragma once 

#endif

其中_msc_ver巨集是由微軟編譯器指定的,表示編譯器的版本號。可以看到,在巨集_msc_ver的值小於1000(vc5.0)時,它對 #pragma once 是不支援的。

2. #ifndef方式

這個是c++語言相關,這是c++語言中的巨集定義,通過巨集定義避免檔案多次編譯。所以在所有支援c++語言的編譯器上都是有效的。如果寫的程式要跨平台,最好使用這種方式。#ifndef由語言支援,移植性好。它依賴於巨集名字不能衝突,這不光可以保證同乙個檔案不會被包含多次,也能保證內容完全相同的兩個檔案不會被不小心同時包含。另外,為了保證不同標頭檔案中的巨集名不衝突,故採取類似於_abc_h_的取名方式。其中,abc.h為當前頭檔名。缺點:如果不同標頭檔案的巨集名不小心「撞車」,可能就會導致標頭檔案明明存在,編譯器卻硬說找不到宣告的狀況。但這個缺點恰恰是我們可以利用的優點,#ifndef方式可以通過前面介紹的特殊的巨集的取名方式來避免名稱衝突問題,於是其缺點也就不復存在了,進而#ifndef方式就更常用了。

還看stdarg.h標頭檔案,這個標頭檔案裡面不僅使用了#pragma once方式而且使用了#ifndef方式來保證該標頭檔案不被多次include.

#ifndef _inc_stdarg 

#define _inc_stdarg  

// ………… 

#endif  /* _inc_stdarg */

3. 總結

·效能上的區別

使用 #ifndef 的話,編譯器每次看到#include這個檔案都需要讀入檔案,解析**;

而使用#pragma once 編譯器根本不會重複開啟檔案, 大大提高了效率。

·編碼風格上的區別

使用#pragma once的**簡潔,重要的是它避免了標頭檔案標號(如_myheader_h_)的 重定義或者 #endif 包含範圍錯誤的情況。

·語意上的區別

#pragma once是針對檔案的,它告訴編譯器,本檔案只編譯一次。

#ifndef…#define…#endif 只是針對檔案中的某乙個標號而言的,它能防止三個指令間包含的內容的重複性處理。就這一點而言,後者更靈活。

可移植性方面

#pragma once是微軟的開發工具中所使用的,如 msvc 等工具可以完好的支援;

#ifndef #define #endif是c++標準裡面的一部分,對於任何完好支援c/c++的編譯器都能使用。顯而易見,後者的可移植性更高。

ifndef和 pragma once的不同

為了避免同乙個檔案被include多次,c c 中有兩種方式,一種是 ifndef方式,一種是 pragma once方式。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。方式一 ifndef somefile h define somefile h 一些宣告...

ifdef 和 pragma once 的區別

方式1 ifdef heat name define heat name endif 方式2 pragma once 正文 方式1用來防止某個巨集被多次定義。方式2是c 語言中的巨集定義,通過巨集定義避免檔案多次編譯,需要編譯平台的支援。他依賴巨集的名字不能重複,這不光保證同一檔案不會被包含多次,也...

標頭檔案保護符和 pragma once

if defined afx h a06facfb de47 4bcd abb3 3ae66c6d9765 included define afx a06facfb de47 4bcd abb3 3ae66c6d9765 included if msc ver 1000 pragma once en...