実装をクライアントから隠したいモジュールがあります。
実際には実装でのみ定義される構造体へのポインターである不透明型を宣言することにしました。
ゼロの値をこのタイプの変数に代入できることを除いて、すべて正常に機能していますが、これは避けたいです。
C での例を次に示します。
ヘッダファイル foo.h
/* foo.h */
typedef struct foo *foo_t; /* <- sorry this was obviously flawed, the '*' was missing */
extern void foo_create( foo_t *t );
extern void foo_destroy( foo_t *t );
extern void foo_tile( foo_t x );
実装ファイル foo.c
/* foo.c */
#include <stdlib.h>
#include "foo.h"
struct foo {
int some_member;
};
void foo_create( foo_t *t )
{
if ( *t==0 ) {
*t = malloc( sizeof(struct foo) );
}
}
void foo_destroy( foo_t *t )
{
if ( *t!=0 ) {
free(*t);
*t = 0;
}
}
void foo_tile( foo_t t )
{
t->some_member++;
}
次に、モジュール bar.c を使用するクライアントの例を示します。
#include "foo.h"
int main( int argc , char **argv )
{
foo_t toe;
foo_create( &toe );
toe = 0; /* <-- How to make the compiler (gcc) refuse this? */
toe = 1; /* <--- the compiler rejects this YAY!! */
}
不透明な型は、実際には動的に割り当てられた構造体へのポインタです。値 0 を割り当てると、コンパイラがこの不透明なポインタへの 0 の割り当てを拒否した場合に回避できるメモリ リークが発生します。
null 以外の値をポインターに割り当てることはコンパイラーによって受け入れられないため、もう少し努力すればゼロ値でも同じことが達成できると思います。
この割り当てを無効にすることはできますか? どうすればそれを達成できますか?C++ または gcc 固有の構成要素を少し使用する必要がある場合は、それで問題ありませんが、純粋な C ソリューションが適しています。
前もって感謝します。