2017-11-13 11 views
3

に対して不透明ポインタを使用して、私はそのように、自分のコードの抽象化とカプセル化を適用する方法として、構造体への不透明ポインタを使用:私のCプログラミングでは、非構造体型

interface_header.h:

typedef struct s_mytype t_mytype; 

defs_header.h:

struct s_mytype 
{ 
/* Actual definition of the struct */ 
}; 

私は(例えばchart_mytypeとして単純型を使用したい私の問題が、interfaに通知しませんそれについてのce。私はちょうどtypedef char t_mytypeを使用することはできません。そのタイプの内部を公開するからです。 私は単にvoidポインタを使うことができますが、型チェックの代償を払って、むしろそれを避けたいと思います。

コンパイラからtypedef redefinition with different typesを投げるので、2つのtypedefを実行することもできません。

私は単純な型になりますが、1つのメンバだけで構造体をやることを検討していますが、それは過剰なものでしょうか?

ご回答ありがとうございます。

+2

不透明タイプが必要な場合は、構造が必要です。不透明感かシンプルさがより重要かどうかを決める。周りにポインタを渡すことを忘れないでください。 –

+2

単一のメンバーを使用します。あなたの*ソース*の定型文のビットですが、コンパイルされたコードは違うはずはありません。 –

+0

'sockaddr'と' sockaddr_in'の実装方法と似たようなことができますか? – MFisherKDX

答えて

3

あなたは決定を下す必要があります。このようなコードでは:

typedef char myHandle; 

frobnicate(myHandle *obj); 

あなたはすでにあなたが後でtypedefを変更することができるはずですので、クライアントコードは唯一、myHandleへのポインタを使用し、決して根本的なタイプについては何も想定しなければならないこと意図を文書化 - クライアントコードが「控えめ」であると仮定しないと仮定してはいけません。あなたは完全にmyHandle背後に何があるか非表示にしたい場合は


structはCで、あなたの唯一のオプションです:

typedef struct myHandle myHandle; 

frobnicate(myHandle *obj); 

とだけプライベートヘッダーまたは実装ファイルでは、あなたが入れます

struct myHandle 
{ 
    char val; 
}; 

最初のオプションは、frobnicate()の場合は、単に*objを使用して値にアクセスでき、2番目のオプションはobj->valと書く必要があります。 2番目のバージョンで得られるのは、クライアントコードを正しく書き込むことです。

結果の実行可能ファイルに関しては、両方のバージョンが同等です。

+1

2番目のバージョンを選択します。それは私のコードの残りの部分と一貫していて、私はいつもそれを述べるのではなく、私の意図を強制する方が好きです。とにかく、 'obj-> val'の構文上のオーバーヘッドを追加することはあまりありません。そこにコードがあまりないので、逆参照部分を期待してください。その答えをありがとう、それは私の心を構成するのに役立ちました! – VannTen

+0

@VannTen逆参照は常に不透明なハンドル/ポインタと 'obj-> val'で必要とされますが、コンパイラはポインタに追加される' 0'のオフセットを見つけるだけです。バイナリに追加のオーバーヘッドはありません。私は個人的には、私のインターフェースの正しい使用を強制したい(これが可能な限り)が、味わいの問題です;)良い質問btw、私は同じデザインの決定に先立って走りました。 –

関連する問題