2012-02-15 34 views
8

我不是低級別非面向對象的編程語言的專家,我在寫一些C代碼在工作中的一個項目中間。我試圖創建一些體面的抽象數據類型來工作,Google搜索讓我意識到人們使用基於結構的ADT有兩種方式。有些人將數據類型定義爲結構:什麼時候應該鍵入結構與指向結構的指針?

typedef struct adt { 
    //content here 
} adt; 

並將其暴露給頭文件中的世界。

其他定義的數據類型作爲指針到結構:

// In .c file: 
typedef struct adt_s { 
    //content here 
} adt_s, *adt; 


// In .h file: 
typedef struct adt_s *adt; 

據我所知,這種方法可以讓你的typedef一個struct沒有給外界的這個結構裏面有什麼是任何知識,讓程序員只能使用使用在同一個頭文件中提供的函數來操作這種數據類型。

是否有一個其他的原因比其他挑?當將ADT定義爲結構時,以及我們什麼時候將它們定義爲結構的指針時,是否有一個通用的「經驗法則」?

回答

6

,您可以轉發聲明結構沒有類型定義太 - 唯一的區別是:接口

  • 看上去是否清潔帶或不帶關鍵字struct
  • 接口看起來是否吸塵器或不明確的指針*

例如,

struct S1; 
typedef struct S2 S2; 
typedef struct S3_s *S3; 

void foo1(struct S1 *arg); 
void foo2(S2 *arg); 
void foo3(S3); 

顯然這隻適用於接口頭中的前向聲明結構。

如果你沒有躲在首位的結構實現,S1S2之間進行選擇是偏好(或一致性)的問題。除非是非常不透明/隱藏類型,否則我不會使用S3

個人喜好是對大/複雜聚合使用S1(顯式結構關鍵字),對於小型結構使用S2,您可能會將它看作值而不總是按指針傳遞。因人而異。

+0

爲了提高可讀性,也許這是最好寫的'typedef結構S3_s * S3',而不是'typedef結構S3_s * S3',不是嗎? – Eregrith 2012-02-15 16:17:34

+0

@Eregrith:如果你使用正式的語言語義,'typedef struct S3_s * S3'表示聲明符'* S3'的類型爲struct S3_s,存儲類爲'typedef',因此將星號標識符實際上是慣用的;然而,將星號與該類型放在一起更符合多少(大多數?)人對於聲明的想法;據我所知,只要你是一致的,兩個版本都沒問題... – Christoph 2012-02-15 16:31:53

+0

我剛剛選擇了與OP的一致性,因爲我可以看到任何方式的好處。 – Useless 2012-02-15 16:36:21

1

隱藏或不隱藏完全贊同你的掌握作爲圖書館的設計師決定。如果您想保留更改struct隨意在未來的權利,你不應該暴露它的任何成員,以「世界第一」的。如果你提供了一個struct如意味着您的圖書館在第一時間進行溝通(例如,struct代表在3D點),那麼你不能將它的成員來自世界隱藏,因爲它會破壞目的。

1

閱讀Linus Torvalds的post 第5章:類型定義