在C++中我們寫頭文件時經常需要#include來包含其他頭文件。頭文件定義的實體經常使用其他頭文件的設施。
包含其他頭文件是如此的司空見慣,甚至一個頭文件被多次包含進同一源文件中也不是什麼稀奇的事。例如一個頭文件中用到string類型的變量,而包含這個頭文件的源文件中也用到string類型的變量,這個時候string頭文件就被包含了兩次:一次是通過程序本身直接包含,另一次是通過包含自寫頭文件而間接包含。
因此,設計頭文件的時候,應該使其可以多次包含在同一源文件中,這一點是很重要的。我們必須保證多次包含同一頭文件不會引起該頭文件的類和對象被多次定義。使得頭文件安全的通用做法是使用預處理器定義的頭文件保護符。頭文件保護符用於避免在已經見到頭文件的情況下重新處理該頭文件的內容。
在編寫頭文件之前,我們需要引入一些額外的預處理器設施。預處理器允許我們自定義變量。www.2cto.com
為了避免命名沖突,預處理器變量經常用全大寫字母表示。預處理器變量有兩種狀態:一定義和未定義。定義預處理器變量和檢測器狀態所用的預處理器指示不同。#define指示接受一個名字並定義該名字為預處理器變量。#ifndef指示檢測指定的預處理器變量是否未定義。如果預處理器變量未定義,那麼跟在其後面的所有指示都被處理,直到出現#endif。為了保證頭文件在給定的源文件中只處理一次,我們首先檢測#ifndef。第一次處理頭文件時,測試會成功,因為相應的預處理器還未定義。下一條語句就定義了該預處理器變量。那樣的話,如果我們編譯的文件敲好又一次包含了該頭文件,#ifndef指示會發現該預處理器已經定義,並且忽略該頭文件的剩余部分。
當沒有兩個頭文件定義和使用同名的預處理器變量時,這個策略相當有效。我們可以用定義在頭文件裡的實體(如類)來命名預處理器變量來避免預處理器變量重名的問題。
注意:頭文件應該包含有保護符,即使這些頭文件不會被其他頭文件包含。編寫頭文件保護符並不難,而且如果頭文件被包含多次,它可以避免難以理解的編譯錯誤。