在我看来,在 C 中隐藏结构的定义通常会使代码更安全,因为您在编译器的帮助下强制要求不能直接访问结构的任何成员。
然而,它有一个缺点,结构的用户不能声明其类型的变量要放入堆栈,因为结构的大小以这种方式变得不可用(因此,用户必须求助于分配堆通过,malloc()
即使它是不可取的)。
这可以(部分)通过alloca(3)
所有主要 libc 实现中存在的函数来解决,即使它不符合 POSIX。
牢记这些优点和缺点,这样的设计总体上可以被认为是好的吗?
在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);
}