乙個專案會切割成很多模組,模組與模組之前的聯絡,需要通過標頭檔案來聯絡起來,這就是為什麼先設計標頭檔案,再實現.c的原因
總結一下編碼歷程:
1,剛開始學c,把各種結構體,函式宣告放乙個.h中;
2,接著發現,要學會隱藏,把結構體,內部函式的宣告放模組使用的.h,把之前乙個大的.h切割成n多的模組.h
3,最後發現,把結構體,內部函式宣告全部放模組.c中(如果沒有依賴的話,甚至乙個內部函式宣告都不用寫);
模組.h只放外部介面函式宣告,其它全部隱藏起來,不對別的模組開放
乙個模組a會用到模組b的引用,通常的設計如下:
///module_b.h:
#ifndef _module_b_h_
#define _module_b_h_
struct b_s
;typedef struct b_s b_t;
int func_b();
#endif
///module_a.h:
#ifndef _module_a_h_
#define _module_a_h_
#include "module_b.h"//不好的設計
struct a_s;
typedef struct a_s a_t;
int func_a(b_t *_data);
#endif
///實際上a模組只是用到b模組的方法,現在卻呼叫了module_b.h,b模組的外部介面函式func_b暴露給a模組了,
把結構體放到module_b.c中去,標頭檔案中只做乙個不完整的定義,修改後的設計:
///module_b.h:
#ifndef _module_b_h_
#define _module_b_h_
struct b_s;//這裡是個不完整定義
typedef struct b_s b_t;
int func_b();
#endif
///module_a.h:
#ifndef _module_a_h_
#define _module_a_h_
struct b_s;//這裡是個不完整定義
struct a_s;
typedef struct a_s a_t;
int func_a(struct b_s *_data);
#endif
///這樣做的原則就是,標頭檔案體積盡量下,不開放給模組的資訊,都不要寫到頭檔案.h中
另外,typedef的使用,到底要不要?許多大牛們反對利用它,(的確上面**重新設計後就必須採用struct b_s結構,如果採用b_t,會有所擔心module_a.h和module_b.h被同乙個引用,最終導致重複定義,大牛們說得很有道理),但是利用它的確可以省去寫n多union,struct的麻煩,而且***_t只是在自己的模組中用,至於其他模組的標頭檔案中的引用,沒辦法,還是老實的用union,struct
log4c中就是這樣用的
另外,如果模組a和模組b相互引用呢?這就相當於c++中的friend
C語言模組化程式設計中的標頭檔案
c和.h檔案都是原始檔,除了字尾不一樣便於區分外和管理外,其他的都是相同的,在.c中編寫的 同樣也可以寫在.h中,包括函式定義 變數定義 預處理等。但是,h 和 c 在專案中承擔的角色不一樣 c 檔案主要負責實現,也就是定義函式和變數 h 檔案主要負責宣告 包括變數宣告和函式宣告 巨集定義 型別定義...
C 中標頭檔案( h)和原始檔( cpp)寫法
這個問題在許多c 程式設計師看來會很搞笑,這麼簡單的問題還用得著你廢話!但是由於本人生性愚鈍,學c 的時候,確實花了很久的時間都搞不明白,只是會寫乙個檔案,但不會寫乙個工程。而用c 編寫比較大型的專案時,檔案的分割管理確實確實是非常必要的 下面就非常簡潔明瞭地談談標頭檔案 h 和原始檔 cpp 應該...
C 中標頭檔案的問題
在編c 時遇到的問題,庫函式strlen,strcmp的標頭檔案問題 include include include using namespace std 兩個都能正確編譯執行,string也是存在的,都是共存的 今天用到randomize 發現沒有了,查了一下,原來randomize 和rand...