1. 程式人生 > >【c/c++】#pragma once 與 #ifndef 的區別解析

【c/c++】#pragma once 與 #ifndef 的區別解析

原文地址:http://blog.csdn.net/hkx1n/article/details/4313303

作用:為了避免同一個檔案被include多次,C/C++中有兩種方式,一種是#ifndef方式,一種是#pragma once方式。

在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。
    

方式一:
    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 宣告、定義語句
    #endif


    方式二:

  #pragma once
    ... ... // 宣告、定義語句

    #ifndef的方式受C/C++語言標準支援。它不光可以保證同一個檔案不會被包含多次,也能保證內容完全相同的兩個檔案(或者程式碼片段)不會被不小心同時包含。
    當然,缺點就是如果不同標頭檔案中的巨集名不小心“撞車”,可能就會導致你看到標頭檔案明明存在,編譯器卻硬說找不到宣告的狀況——這種情況有時非常讓人抓狂。
    由於編譯器每次都需要開啟標頭檔案才能判定是否有重複定義,因此在編譯大型專案時,ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支援#pragma once的方式。

    #pragma once一般由編譯器提供保證:同一個檔案不會被包含多次。注意這裡所說的“同一個檔案”是指物理上的一個檔案,而不是指內容相同的兩個檔案。你無法對一個頭檔案中的一段程式碼作pragma once宣告,而只能針對檔案。
    其好處是,你不必再費勁想個巨集名了,當然也就不會出現巨集名碰撞引發的奇怪問題。大型專案的編譯速度也因此提高了一些。
    對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。當然,相比巨集名碰撞引發的“找不到宣告”的問題,這種重複包含很容易被發現並修正。

    #pragma once方式產生於#ifndef之後,因此很多人可能甚至沒有聽說過。目前看來#ifndef更受到推崇。因為#ifndef受C/C++語言標準的支援,不受編譯器的任何限制;而#pragma once方式卻不受一些較老版本的編譯器支援,一些支援了的編譯器又打算去掉它,所以它的相容性可能不夠好。一般而言,當程式設計師聽到這樣的話,都會選擇#ifndef方式,為了努力使得自己的程式碼“存活”時間更久,通常寧願降低一些編譯效能,這是程式設計師的個性,當然這是題外話啦。

    還看到一種用法是把兩者放在一起的:

    #pragma once
    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 宣告、定義語句
    #endif

    看起來似乎是想兼有兩者的優點。不過只要使用了#ifndef就會有巨集名衝突的危險,也無法避免不支援#pragma once的編譯器報錯,所以混用兩種方法似乎不能帶來更多的好處,倒是會讓一些不熟悉的人感到困惑。

    選擇哪種方式,應該在瞭解兩種方式的情況下,視具體情況而定。只要有一個合理的約定來避開缺點,我認為哪種方式都是可以接受的。而這個已經不是標準或者編譯器的責任了,應當由程式設計師自己或者小範圍內的開發規範來搞定。


相關推薦

c/c++#pragma once #ifndef區別解析

原文地址:http://blog.csdn.net/hkx1n/article/details/4313303 作用:為了避免同一個檔案被include多次,C/C++中有兩種方式,一種是#ifndef方式,一種是#pragma once方式。 在能夠支援這兩種方式的

C++中#pragma once #ifndef區別解析

原文地址:http://blog.csdn.net/hkx1n/article/details/4313303   作用:為了避免同一個檔案被include多次,C/C++中有兩種方式,一種是#ifndef方式,一種是#pragma once方式。 在能夠支援這兩種方式的編譯器

#pragma once #ifndef防止重編譯區別

cin blank ndt 防止 store ycm bds csv 獎章 郎P爬慚史73伎X1http://docstore.docin.com/spk6612 蒲2U萄z渴y欣背贍4oehttp://docstore.docin.com/sina_5847888885

#pragma once#ifndef

1.相同點: 都是為了避免同一個標頭檔案被包含多次。在編譯器對這兩種方式都支援的情況下,區別很小。 方式一: #pragma once ...//這裡放宣告語句 方式二: #ifndef 巨集名 #def 巨集名 ...//這裡放宣告語句 #endif 2.不同點: (1)#i

#pragma once #ifndef

轉自:https://www.cnblogs.com/terrytian88/p/5820159.html 為避免同一個檔案被包含多次,有以下兩種處理方式:          方式一:由語言支援, 所以移植性好    

#pragma once #ifndef,#define,#endif的差別 、重複定義等相關問題

今天寫程式時,對編譯預處理和#pragma once,#ifndef,#define,#endif產生了一些困惑,以前都是知道個大概,今天一下子查了很多資料,下面就是一些我現在對這個問題的認識,弄清楚這些,再加上我轉的一篇.h和.cpp區別的部落格,對於認清重定義,預處理幫

標頭檔案保護符和#pragma once #pragma once #ifndef區別

為了避免同一個檔案被include多次 1   #ifndef方式 2   #pragma once方式 在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。     方式一:     #ifndef __SOMEFILE_H__     #define __SOMEFIL

#pragma once #ifndef比較分析

為了避免同一個檔案被include多次,C/C++中有兩種方式,一種是#ifndef方式,一種是#pragma once方式。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。 方式一: #ifndef __SOMEFILE

#pragma once #ifndef 解析

    為了避免同一個檔案被include多次,C/C++中有兩種方式,一種是#ifndef方式,一種是#pragma once方式。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。    方式一:    #ifndef __SOMEF

#pragma once#ifndef條件編譯區別

【1】#pragma once這個巨集有什麼作用? 為了避免同一個標頭檔案被包含(include)多次,C/C++中有兩種巨集實現方式:一種是#ifndef方式;另一種是#pragma once方式。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別。但兩者仍然有

轉帖:#pragma once #ifndef區別

為了避免同一個檔案被include多次 1   #ifndef 方式 2   #pragma once方式 在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。 方式一:     #ifndef __SOMEFILE_H__     #de

C/C++學院0831-類對象的異常/面試100題1-100

oid tdi 面試 mod get() ng- java article ron 類與對象的異常 Cpp異常 #include <iostream> #include <string.h> using namespace st

C/C++開發函式指標回撥函式

C++很多類庫都喜歡用回撥函式,MFC中的定時器,訊息機制,hook機制等待,包括現在在研究的cocos2d-x中也有很多的回撥函式。 1.回撥函式 什麼是回撥函式呢?回撥函式其實就是一個通過函式指標呼叫的函式!假如你把A函式的指標當作引數傳給B函式,然後在B函式中通過A函式傳進來的這個指標

C基礎空字元'\0'字串

空字元'\0' 空字元即NUL位元組,是一個ASCII值為0的控制字元,在程式程式碼中通常以轉義序列'\0'表示,在C語言中,空字元非常重要,主要體現在字串中。 字串 字串就是一串零個或多個字元,並且以位模式為全0的NUL位元組即空字元('\0')結尾。C語言中字串沒有顯

特徵匹配SIFT原理C原始碼剖析

     SIFT的原理已經有很多大牛的部落格上做了解析,本文重點將以Rob Hess等人用C實現的程式碼做解析,結合程式碼SIFT原理會更容易理解。一些難理解點的用了☆標註。       歡迎大家批評指正! 轉載請註明出處:http://blog.csdn.net/l

C/C++學院0831-類物件的異常/面試100題1-100

類與物件的異常 Cpp異常 #include <iostream> #include <string.h> using namespace std; //標識錯誤的型別

C/C++開發VS開發win32位x64位下各型別長度對比

64 位的優點:64 位的應用程式可以直接訪問 4EB 的記憶體和檔案大小最大達到4 EB(2 的 63 次冪);可以訪問大型資料庫。本文介紹的是64位下C語言開發程式注意事項。 1. 32 位和 64 位C資料型別 32和64位C語言內建資料型別,如下表所示:

C語言define和typedef的區別

#define是 巨集定義命令,#define DINT int相當於將程式碼中的int可以寫為DINT,DINT等價於int。typedef int TINT; 是型別定義,TINT型別的變數就是int型別的變數。 1.typedef int TINT; 和#define

C語言指標和陣列的區別和聯絡

1.指標    int  *  p     ( 這裡定義一個指標      p為指標變數     指向的是某一個地址)                2.陣列      int  arr [10]         這裡定義了10個int 型別的資料  可以通過arr[0] 

C語言巨集和函式的區別

由之前的巨集的引入我們知道,巨集函式可以完成一些簡單的運算。那是不是巨集函式就可以取代函式呢?巨集函式和函式到底有哪些區別呢? 下面我們來分析他們其中的區別。 1.程式碼長度:   對於巨集,每次使用時,巨集程式碼都被插入到程式中。除了非常小的巨集之外,程式的長度將大幅度增