如下所示,代碼中為什么要有這樣的結(jié)構(gòu)呢?
編寫頭文件test.h時,在頭文件開頭寫上兩行,如下:
#ifndef __TEST_H
#define __TEST_H
"
...... #內(nèi)容
......
"
頭文件結(jié)尾寫上一行:
#endif
這是因為:防止文件中的內(nèi)容被重復(fù)定義
我們來看下面這樣一個例子,定義了main.cpp,a.h,b.h,c.h,其中main.cpp包含了a.h和b.h,a.h包含了c.h,b.h也包含了c.h。

main.cpp

a.h

b.h

c.h
這樣編譯是無法通過的,因為在編譯main.cpp時先運行
#include "a.h",此時編譯了a.h中的c.h,也即給int a變量做了定義,后運行到#include "b.h",此時編譯了b.h中的c.h,又給int a進行了重定義,所以報了重定義的錯誤:
發(fā)生重定義錯誤
解決的方法就是,使用
#ifndef系列語句塊將c.h中的int a = 10;這一語句包裝起來,包裝結(jié)果如下:
#ifndef UNTITLED2_C_H
#define UNTITLED2_C_H
int a = 10;
#endif //UNTITLED2_C_H
這樣就可以通過編譯,main.cpp文件也可以正常運行了。所以我們在編寫頭文件時,盡量將所有語句放在#ifndef語句塊中,防止重定義報錯。至于命名規(guī)則,通常#ifndef以及#define后面接的是頭文件名稱的全部字符大寫,如#ifndef __C_H,當(dāng)然也可以自行任意命名,為編譯器添加一個可識別的標(biāo)簽即可