標準格式:在頭文件中寫:
#ifndef -XXX-
#define -XXX-
.......
#endif
通過閱讀 GeekBand c++學習筆記——防衛式聲明的背後,發現編譯器對頭文件進行了以下預處理:
- 編譯器將處理掉所有註釋,以空格代替;
- 刪除#define,展開所有宏定義;
- 處理條件編譯指令#if、#ifdef、#elif、#else、#endif;
- 處理#include,展開被包含的頭文件(直接將頭文件複製進文件)
- 保留編譯器需要使用的#progma指令等等。
編譯器還會做很多其他事情,但是從第四條可以看出,會將頭文件中寫的代碼直接複製進文件。那麼可以想象,如果有多份頭文件均不進行防衛式聲明,均包含了類似<iostream>這種內容很多的頭文件,經過預處理以後的文件,即便自己只寫了一行代碼cout,它包含的代碼量將是何其的龐大。這還不是最關鍵的問題,關鍵是頭文件中定義了一個變量,那麼多次包含該頭文件之後,就會產生重複定義的問題,那麼防衛式聲明其實防止重複聲明與定義。