想必不少人都看到過頭文件中寫有:#ifndef HeaderName_h編程
#define HeaderName_h函數
// 這裏面一般寫各類宏定義、其餘頭文件的包含學習
#endif spa
這樣作的目的:防止該頭文件被重複引用。io
「頭文件被重複引用」是什麼意思?編譯
答:其實「被重複引用」是指一個頭文件在同一個cpp文件中被include了屢次,這種錯誤經常是因爲include嵌套形成的。class
好比:存在a.h文件#include "c.h",而b.cpp文件同時#include "a.h" 和#include "c.h",此時就會形成c.h被b.cpp重複引用。效率
頭文件被重複引用引發的後果:變量
有些頭文件重複引用只是增長了編譯工做的工做量,不會引發太大的問題,僅僅是編譯效率低一些。可是對於大工程而言,編譯效率低下那將是一件多麼痛苦的事情。引用
而有些頭文件重複包含,則會引發錯誤,好比:在頭文件中定義了全局變量(雖然這種方式不被推薦,但確實是C規範容許的),這種頭文件重複包含會引發全局變量的重複定義。
是否是全部的頭文件中都要加入#ifndef/#define/#endif 這些代碼?
答案:不是必定要加,但最好加上!這是由於:無論怎樣,用ifnde xxx #define xxx #endif,只有好處,沒有壞處。
而且,我的以爲培養一個好的編程習慣是學習編程的一個重要方面。
下面給一個#ifndef/#define/#endif的格式:
首先寫:#ifndef A_H (意思是:"if not define a.h",即若是不存在a.h)
接着寫:#define A_H (那就引入a.h)
最後寫:#endif (不然不須要引入a.h,即已存在a.h,無需再次引入)
例:
#ifndef GRAPHICS_H // 防止graphics.h被重複引用
#define GRAPHICS_H
#include <math.h> // 引用標準庫的頭文件
…
#include 「header.h」 // 引用非標準庫的頭文件
…
void Function1(…); // 全局函數聲明
…
class Box // 類結構聲明
{
…
};
#endif