1、頭文件中適合放置接口的聲明,不適合放置實現(只用函數聲明,不要具體實現);
2、頭文件應當職責單一(一個頭文件實現簡單的統一的功能,功能過大,責任過多,可能要包含好多頭文件,當程序加載時,要加載每個包含的頭文件,會導致編譯時間過長);
3、頭文件的包含關係是一種依賴,一般來說,應當讓不穩定的模塊依賴穩定的模塊,從而當不穩定的模塊發生變化時,不會影響(編譯)穩定的模塊;
4、每一個.c文件應有一個同名.h文件,用於聲明需要對外公開的接口;
5、禁止頭文件循環依賴,當頭文件循環依賴時,改動其中一個,所有的頭文件都要重新編譯;
6、.c/.h文件禁止包含用不到的頭文,節省編譯時間;但頭文件應當自包含,不能在使用對應的.c文件時,還需要添加別的.h文件才能;編譯通過;
7、爲每個文件配置一個宏,當頭文件第一次被包含時就定義這個宏,並在頭文件被再次包含時使用它以排除文件內容
假定VOS工程的timer模塊的timer.h,其目錄爲VOS/include/timer/timer.h,應按如下方式保護:
#ifndef VOS_INCLUDE_TIMER_TIMER_H#define VOS_INCLUDE_TIMER_TIMER_H
...
#endif
1)保護符使用唯一名稱;
2)不要在受保護部分的前後放置代碼或者註釋;
3):頭文件的版權聲明部分以及頭文件的整體註釋部分(如闡述此頭文件的開發背景、使用注意事項等)可以放在保護符(#ifndef XX_H)前面。
8、禁止在頭文件中定義變量,在頭文件中定義變量,將會由於頭文件被其他.c文件包含而導致變量重複定義。
9、只能通過包含頭文件的方式使用其他.c提供的接口,禁止在.c中通過extern的方式使用外部函數接口、變量。
10、包含標準庫頭文件用尖括號<>,包含非標準庫頭文件用雙引號“”
建議:
1、一個模塊通常包含多個.c文件,建議放在同一個目錄下,目錄名即爲模塊名。爲方便外部使用者,建議每一個模塊提供一個.h,文件名爲目錄名。需要注意的是,這個.h並不是簡單的包含所有內部的.h,它是爲了模塊使用者的方便,對外整體提供的模塊接口。
2、如果一個模塊包含多個子模塊,則建議每一個子模塊提供一個對外的.h,文件名爲子模塊名。降低接口使用者的編寫難度
3、頭文件不要使用非習慣用法的擴展名,如.inc;使用.inc還導致source insight、Visual stduio等IDE工具無法識別其爲頭文件,導致很多功能不可用,如“跳轉到變量定義處”。雖然可以通過配置,強迫IDE識別.inc爲頭文件,但是有些軟件無法配置,如Visual Assist只能識別.h而無法通過配置識別.inc。
4、同一產品統一包含頭文件排列方式;常見的包含頭文件排列方式:功能塊排序、文件名升序、穩定度排序;建議將不穩定的頭文件放在前面,某一.h文件較爲頻繁更改,如果有錯誤,則不會編譯其下面的頭文件,可以減少編譯時間;