1. 程式人生 > >c/c++標頭檔案中#ifndef/#define/#endif的用法

c/c++標頭檔案中#ifndef/#define/#endif的用法

想必很多人都看過“標頭檔案中用到的 #ifndef/#define/#endif 來防止該標頭檔案被重複引用”。但是是否能理解“被重複引用”是什麼意思?標頭檔案被重複引用了,會產生什麼後果?是不是所有的標頭檔案中都要加入#ifndef/#define/#endif 這些程式碼?

1、 其實“被重複引用”是指一個頭檔案在同一個cpp檔案中被include了多次,這種錯誤常常是由於include巢狀造成的。如:存在a.h檔案#include "c.h"而此時b.cpp檔案匯入了#include "a.h" 和#include "c.h"此時就會造成c.h重複包含。

2、標頭檔案被重複引用引起的後果:

(1)有些標頭檔案重複引用,只是增加了編譯工作的工作量,不會引起太大的問題,僅僅是編譯效率低一些,但是對於大工程而言編譯效率就是很重要的了。

(2)有些標頭檔案重複包含,會引起編譯錯誤,比如在標頭檔案中定義了全域性變數或寫了函式的實現而不是宣告(雖然這種方式不被推薦,但確實是C規範允許的),這種會引起重複定義。

3、 是不是所有的標頭檔案中都要加入這些程式碼?

    不是一定要加,但是不管怎樣,用#ifndef/#define/#endif或者其他方式避免標頭檔案重複包含,只有好處沒有壞處。培養一個好的程式設計習慣是學習程式設計的一個重要分支。所以在寫標頭檔案時,最好是把內容都寫在#ifndef和#endif之間。

下面給出#ifndef/#define/#endif的用法:

#ifndef __XXX_H__    //意思是  "if not define __XXX_H__" 也就是沒包含XXX.h
     
#define __XXX_H__   //就定義__XXX_H__

...  //此處放標頭檔案中本來應該寫的程式碼

#endif       //否則不需要定義 

若未定義XXX.h則這裡就定義XXX.h,然後執行裡面的內容,若下次還走到了這個檔案,則進行#ifndef的判斷,則#ifndef與#endif之間的內容不會再次被載入