我想强迫某个结构永远不要使用结构函数直接访问其字段。
示例:
struct NoOutsideAccess { int field1;}
struct example {NoOutsideAccess f1;}
NoOutsideAccess noa;
example * ex;
&noa // OK
&ex->noa // OK
noa.field1; // ERROR
ex->f1.field1 // ERROR
我看过C解析器和分析工具,但不确定是否可以使用它们。
我不想更改该结构,因为它的字段将直接在其他模块中使用。在这种情况下,我需要一些脚本来指出它的使用位置,以便不应该使用的模块可以更改它。
但是我确实找到了duplicate,不确定是否可以匹配每种用法,但会尝试一下。
答案 0 :(得分:5)
在C中创建不透明对象的一种方法是将定义隐藏在C文件中,并且仅导出访问器原型以及该对象在头文件中的前向声明:
/* foo.h */
struct foo; /* forward declaration */
struct foo *foo_new (int bar, const char *baz);
void foo_free(struct foo *foo);
int foo_get_bar(struct foo *foo);
const char *foo_get_baz(struct foo *foo);
然后执行:
/* foo.c */
struct foo {
int bar;
const char *baz;
};
/* implementations of foo_{new,free,get_bar,get_baz} */
注意:由于外部代码不知道struct foo
的大小,因此您只能在其中使用指向foo
的指针(这就是foo_new
的位置)。