在編寫標頭檔之前,我們需要引入一些額外的前置處理器設施。前置處理器允許我們自訂變數。
前置處理器變數的名字在程式中必須是唯一的。任何與前置處理器變數相匹配的名字的使用都關聯到該前置處理器變數。為了避免名字衝突,前置處理器變數經常用全大寫字母表示。
前置處理器變數有兩種狀態:已定義或未定義。定義前置處理器變數和檢測其狀態所用的前置處理器指示不同。#define
指示接受一個名字並定義該名字為前置處理器變數。#ifndef
指示檢測指定的前置處理器變數是否未定義。如果前置處理器變數未定義,那麼跟在其後的所有指示都被處理,直到出現 #endif
。
可以使用這些設施來預防多次包含同一標頭檔:
#ifndef SALESITEM_H
#define SALESITEM_H
// Definition of Sales_itemclass and related functions goes here
#endif
條件指示
#ifndef SALESITEM_H
測試 SALESITEM_H
前置處理器變數是否未定義。如果 SALESITEM_H
未定義,那麼 #ifndef
測試成功,跟在 #ifndef
後面的所有行都被執行,直到發現#endif
。相反,如果 SALESITEM_H
已定義,那麼 #ifndef
指示測試為假,該指示和 #endif
指示間的代碼都被忽略。
為了保證標頭檔在給定的源檔案中只處理過一次,我們首先檢測 #ifndef
。第一次處理標頭檔時,測試會成功,因為 SALESITEM_H
還未定義。下一條語句定義了 SALESITEM_H
。那樣的話,如果我們編譯的檔案恰好又一次包含了該標頭檔。#ifndef
指示會發現 SALESITEM_H
已經定義,並且忽略該標頭檔的剩餘部分。
標頭檔應該含有保護符,即使這些標頭檔不會被其他標頭檔包含。編寫標頭檔保護符並不困難,而且如果標頭檔被包含多次,它可以避免難以理解的編譯錯誤。當沒有兩個標頭檔定義和使用同名的前置處理器常量時,這個策略相當有效。我們可以為定義在標頭檔裡的實體(如類)命名前置處理器變數來避免前置處理器變數重名的問題。一個程式只能含有一個名為 Sales_item
的類。通過使用類名來組成標頭檔和前置處理器變數的名字,可以使得很可能只有一個檔案將會使用該前置處理器變數。