2012-02-15 20 views
8

私は低レベルの非オブジェクト指向プログラミング言語の専門家ではなく、仕事中のプロジェクトのCコードを書く途中です。私はいくつかのまともな抽象データ型を作成しようとしています、そして、私は、人々が構造体ベースのADTを2つの方法で使用することを知りました。構造体としてデータ型を定義する人もいれば、ヘッダファイルで世界に公開する人もいます。structとstructの型をtypedefするのはいつですか?

その他は構造体へポインタなどのデータ型を定義:

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


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

私はプログラマのように、このアプローチは、あなたが、外の世界にこの構造体の内部で何の知識を与えることなく構造体をtypedefをすることを可能にすることを理解しますcan このデータ型を操作するために同じヘッダーファイルで提供される関数を使用します。

他のものを選ぶ理由はありますか?構造体としてADTを定義するときの一般的な「経験則」はありますか?構造体へのポインタとしていつ定義しますか?

答えて

6

あなたはあまりにもtypedefをせずに構造体を宣言転送することができます - 唯一の違いは、次のとおりです。

  • インターフェイスは、インターフェイスが明示的なポインタの有無にかかわらずクリーンに見えるかどうかのキーワード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を使用します。 YMMV。

+0

を多分それは*のtypedef構造体S3_s 'の代わりに' typedefは構造体S3_s * S3'、ないのS3'を書く方が良いでしょうか? – Eregrith

+0

@Eregrith:正式な言語セマンティクスの場合、 'typedef struct S3_s * S3'宣言子' * S3'は 'struct S3_s'型と' typedef'型の記憶クラスなので、アスタリスクに識別子を入れるのは実際には慣用的です;しかし、アスタリスクを型に入れることは、宣言について何人(ほとんどの人)が考えるかともっと調和しています。あなたが一貫性を持っている限り、どちらのバージョンも問題はありません。 – Christoph

+0

私は、OPとの一貫性のためにその間隔を選択しました。 – Useless

1

隠すかどうかを決定することは、あなたのライブラリのデザイナーとしてあなたに完全に委ねられます。 structを将来変更する権利を予約したい場合は、そのメンバーを「世界」に公開しないでください。最初にライブラリと通信する手段としてstructを指定している場合(たとえば、structが3Dのポイントを表す場合)、その目的を無効にするため、そのメンバーを世界中から非表示にすることはできません。

1

は、Linus Torvalds氏post 第5章読む:読みやすさの目的でのtypedef

関連する問題