9

私の意見では、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);
}
4

2 に答える 2

2

関数barは未定義の動作を呼び出します: が指す構造体は初期化されていませfooん。

構造の詳細を非表示にする場合は、構造foo_create()を割り当てて初期化し、foo_finalizeリソースを解放して解放する を指定します。

あなたが提案していることは機能する可能性がありますが、エラーが発生しやすく、一般的な解決策ではありません。

于 2015-12-15T22:32:47.460 に答える