我认为隐藏结构定义会使代码更安全,因为您在编译器的帮助下强制执行,不能直接访问结构的任何成员.缺点是用户无法在堆栈上声明结构类型的变量,因为结构的大小未知,有时需要避免使用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); }
UPD:更新了问题,明确指出使用的思想alloca()
是能够在堆栈上声明结构但隐藏其定义.