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