カプセル化もどきを実現するならば、struct の定義や private な関数は C ファイルに static で書いて非公開、
ヘッダファイル には struct へのポインタ型と、public な関数だけを記述しなければならない。
インスタンスを作る関数以外の public な関数には、
必ず struct へのポインタ型の引数がなければならない。
当然、インスタンスを作る関数内に malloc などが必要で、
破棄する関数で free を使う。

ポインタがある時点で、書き換えて欲しくない変数も強引に書き換えられるから、
厳密なカプセル化なんて無理だけどね。