加上以上的宏是未了防止頭文件被重複引用,當編譯器第一次編譯頭文件的時候,會定義_HEAD_H,然後如果還有文件引用了該頭文件,但_HEAD_H已經被定義了,所以就不會在去編譯你的頭文件添加的內容。這就是條件編譯。
比如你有兩個cpp文件,這兩個cpp文件都include了同一個頭文件。而編譯時,這兩個Cpp文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明衝突。
例如:
假設你的工程裏面有4個文件,分別是a.cpp,b.h,c.h,d.h。
a.cpp的頭部是:
#include "b.h "
#include "c.h "
b.h和c.h的頭部都是:
#include "d.h "
而d.h裏面有class D的定義。
這樣一來,
編譯器編譯a.cpp的時候,先根據#include “b.h “去編譯b.h這個問題,再根據b.h裏面的#include “d.h “,去編譯d.h的這個文件,這樣就把d.h裏面的class D編譯了;
然後再根據a.cpp的第二句#include “c.h “,去編譯c.h,最終還是會找到的d.h裏面的class D,但是class D之前已經編譯過了,所以就會報重定義錯誤。 加上ifndef/define/endif,就可以防止這種重定義錯誤。
所以還是把頭文件的內容都放在#ifndef和#endif中吧。
不管你的頭文件會不會被多個文件引用,你都要加上這個。
一般格式是這樣的:
#ifndef <標識 >
#define <標識 >
......
......
#endif <標識 >
在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的“.”也變成下劃線,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif