私は、構造体の定義が隠れていると、構造体のメンバーに直接アクセスすることができないコンパイラの助けを借りて、コードを安全にすると思います。欠点は、構造体のサイズがわからないためにスタック上の構造体型の変数を宣言できないことです。一方、時にはmalloc()
を使用しないことが望ましい場合もあります。この機能はPOSIXに準拠していませんが、これは(部分的に成功して)alloca(3)
で解決できます。これはすべての主要なlibc実装に存在します。この小さな賛否両論を考えると、そのようなデザインは一般的に良いと思われますか?Cの構造定義を非表示にするのは良い方法ですか?
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);
}
UPD:述べ、質問を更新しましたがの考えていることを明示的ですalloca()
を使用すると、その定義を隠しながらスタック上に構造体を宣言することができます。
より一般的な選択肢は、 'foo_create'や' foo_destroy'のようなものを使うことです。つまり、構造体の詳細を公開しないで、内部的に 'malloc'のポインタ。おそらく 'alloca'を使用したいと思う貴重な状況がいくつかあります。おそらく' malloc'と友人が限られている組み込みシステム以外のものです。 –
構造体が不透明である場合、この例に示すように、クライアントコードでその型の変数を割り当てたり宣言したりする必要があります。構造体のすべてのインスタンスは、ライブラリ自体から来る必要があります。 – kaylum
'VLA []'は許可されていますか? (C99)? 'foo_size'の文字配列を宣言すると(' alignas'を使って)動作するかもしれません。しかし、gerneralで、@ kaylum – chux