私の意見では、C で構造体の定義を非表示にすると、構造体のメンバーに直接アクセスできないように (コンパイラーの助けを借りて) 強制するため、一般的にコードが安全になります。
ただし、この方法では構造体のサイズが利用できなくなるため、構造体のユーザーがその型の変数をスタックに置くことを宣言できないという欠点があります (したがって、ユーザーは、malloc()
望ましくない場合でもヒープを経由します)。
これは、POSIX に準拠しalloca(3)
ていなくても、すべての主要な libc 実装に存在する関数によって (部分的に) 解決できます。
これらの長所と短所を念頭に置いて、そのような設計は一般的に良いと見なすことができますか?
でlib.h
:
struct foo;
extern size_t foo_size;
int foo_get_bar(struct foo *);
でlib.c
:
struct foo {
int bar;
};
size_t foo_size = sizeof foo;
int foo_get_bar(struct foo *foo)
{
return foo->bar;
}
でexample.c
:
#include "lib.h"
int bar(void)
{
struct foo *foo = alloca(foo_size);
foo_init(foo);
return foo_get_bar(foo);
}