一般に、C でコードをカプセル化する最良の方法は、直接データ構造にアクセスする代わりに関数を使用することです。
たとえば、「人」のデータ構造を考えてみましょう。これをヘッダーで公開する代わりに:
typedef struct {
int age;
int weight_lbs;
} person;
代わりに、パブリック ヘッダーで次を公開します。
typedef void *person;
extern person person_create();
extern void person_destroy(person p);
extern int person_get_age(person p);
extern void person_set_age(person p, int age);
extern int person_get_weight(person p);
extern void person_set_weight(person p, int weight_lbs);
次に、.c またはプライベート ヘッダーで実際の person 構造体を定義します。person_create() と person_destroy() は重要です。基礎となる構造が隠されているので、人を作成する方法を提供する必要があるからです。
これには次の利点があります。
- クライアントがデータにアクセスする方法を最大限に制御できます
- バイナリ互換性を損なうことなくデータ構造を変更できます
- 公開された関数でシンボルのバージョン管理を使用できるようにします
主な欠点は、より冗長であり、パフォーマンスの低下が最小限であることです。より複雑なメモリ管理の問題 (ブロックプールを使用したいなど) がある場合は、より困難になる可能性がありますが、それでも実行できます。