2016-09-22 6 views
0

私はこれについて正しく質問する方法さえしていません。データを渡す際の実装の詳細を隠す

私は複数の実装があるライブラリを作成しています(複数のライブラリがあります)。私は、実装の詳細を無視してアプリケーションを書くために、クライアントアプリケーションからの実装の詳細をすべてではなくてもできるだけ隠すことを望みます。

実装が1つの関数内に含まれる場合は、すべて問題ありません。しかし、しばしば私はライブラリから構造体をインスタンス化し、ライブラリからの関数で何かを行い、通常通りアプリケーションを書き直してから、ライブラリからの関数を使ってライブラリから関数に戻す必要があります。

構造体の詳細は、ライブラリ関数に対してのみ重要です。私は、クライアントアプリケーションからのものを見るか触れる必要はありません。

クライアントアプリケーションから構造体の詳細を隠して使用できる方法がありますか、またはカプセル化の何らかの形でこれを行う別の方法がある場合や、多分何らかの種類のデータ(グローバル?)しか表示されない場合ライブラリに?

は、ここでは、コードと私のラメイラスト例です:

/* 
library_private.h 
*/ 
#if (A) 
{ 
    struct mystruct_t { 
     A *something; 
    } 
} 
#else 
    struct mystruct_t { 
     B *something; 
    } 
#endif 

/* 
library_public.h 
*/ 
struct mystruct_t; 

/* 
library.c 
*/ 
struct mystruct_t* create() { 

    struct mystruct_t *handle = malloc(sizeof(struct mystruct_t)); 

    return handle; 
} 

/* 
client.h 
*/ 

struct mystruct_t; 
/* but, I need a definition, so I have to repeat either from library_private.h */ 

/* 
client.c 
*/ 

int main(int argc, char const *argv[]) { 

    struct mystruct_t *handle = create(); 

    /*...*/ 

    something(handle); 

    return 0; 
} 

答えて

0

返すのvoid *にキャストし、バック構造にmystruct_tだけの関数に渡しました。これは、コンパイラの型チェックのいくつかを緩めるので、素晴らしいことではありません。

+0

これはオプションで作業しているようです。閉める前にもっと良いオプションがあるかどうかがわかります。ありがとう! – Keyframe

+0

私はこれをお勧めしません。私は誤った 'void * 'を間違った関数に渡す確率は、あなたがしたくないときに構造体にアクセスするよりもずっと大きいと思う。 – EOF

+0

ライブラリーの呼び出しの間にデータを保持すると同時に、実装の詳細をクライアントから隠し、ライブラリー内のグローバルを避けるために推奨することは何ですか? – Keyframe

0

client.c(またはclient.h)は、library_public.hを含む必要があります。構造定義を持つ必要はありません。構造体へのポインタを使用するには、その宣言struct mystruct_t;だけで十分です。もちろん、メンバーにアクセスすることはできませんが、これはまさにあなたがこの場合に望むものです。

関連する問題