C文件頭文件編程技巧

每一個.c文件應有一個同名.h文件,用於聲明需要對外公開的接口。將對內函數的聲明放置.c文件的頭部,並聲明爲static,以限制其作用域在該.c 文件定義的編譯單元

 

禁止頭文件循環依賴

說明:頭文件循環依賴,指a.h包含b.h,b.h包含c.h,c.h包含a.h之類導致任何一個頭文件修改,都導致所有包含了a.h/b.h/c.h的代碼全部重新編譯一遍。而如果是單向依賴,如a.h包含b.h,b.h包含c.h,而c.h不包含任何頭文件,則修改a.h不會導致包含了b.h/c.h的源代碼重新編譯

c/.h文件禁止包含用不到的頭文件

說明:很多系統中頭文件包含關係複雜,開發人員爲了省事起見,可能不會去一一鑽研,直接包含一切想到的頭文件,甚至有些產品乾脆發佈了一個god.h,其中包含了所有頭文件,然後發佈給各個項目組使用,這種只圖一時省事的做法,導致整個系統的編譯時間進一步惡化,並對後來人的維護造成了巨大的麻煩。

總是編寫內部#include保護符(#define 保護)

說明:多次包含一個頭文件可以通過認真的設計來避免。如果不能做到這一點,就需要採取阻止頭文件內容被包含多於一次的機制。

通常的手段是爲每個文件配置一個宏,當頭文件第一次被包含時就定義這個宏,並在頭文件被再次包含時使用它以排除文件內容。

所有頭文件都應當使用#define 防止頭文件被多重包含,命名格式爲__FILENAME_H,爲了保證唯一性,

定義包含保護符時,應該遵守如下規則:

1)保護符使用唯一名稱;

2)不要在受保護部分的前後放置代碼或者註釋。

 

示例:假定VOS工程的timer模塊的timer.h,其目錄爲VOS/include/timer/timer.h,應按如下方式保護:

#ifndef __INCLUDE_TIMER_TIMER_H

#define __INCLUDE_TIMER_TIMER_H

...

#endif

 

例外情況:頭文件的版權聲明部分以及頭文件的整體註釋部分(如闡述此頭文件的開發背景、使用注意事項等)可以放在保護符(#ifndef XX_H)前面。

禁止在頭文件中定義變量

說明:在頭文件中定義變量,將會由於頭文件被其他.c文件包含而導致變量重複定義。

只能通過包含頭文件的方式使用其他.c提供的接口,禁止在.c中通過extern的方式使用外部函數接口、變量

說明:若a.c使用了b.c定義的foo()函數,則應當在b.h中聲明extern int foo(int input);並在a.c中通過#include <b.h>來使用foo。禁止通過在a.c中直接寫extern int foo(int input);來使用foo,後面這種寫法容易在foo改變時可能導致聲明和定義不一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章