C++中 #ifndef #define #endif的作用

加上以上的宏是未了防止頭文件被重複引用,當編譯器第一次編譯頭文件的時候,會定義_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  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章