我在hostap中找到了一些代码.以下是简化的:
a.h// it just declares 'there is a struct a'
struct a;
// it seems like an accessor to a private member b
int get_b(struct a);
Run Code Online (Sandbox Code Playgroud)
a.c// definition is seprated from a header file
struct a {
int b;
};
int get_b(struct a) {
return a.b;
}
Run Code Online (Sandbox Code Playgroud)
a.o使用这两个文件生成目标文件.
如果其他源代码想要使用struct a,则无法直接访问成员b,并且编译器会抱怨dereferencing incomplete type.我只能访问一个成员b有get_b().
第一次,我对这种模式感到非常沮丧.但最后,我觉得如果有人想要保护其完整性,这是一个设计良好的模式struct a(例如,成员的价值观必须按照某些标准设定,或者成员彼此依赖,以便一个成员的变化会影响其他)
这种模式有术语吗?
这被称为不透明类型.你知道一个特定的struct存在,但没有别的.
因为您对opaque结构的内容一无所知,所以如果它不能创建实例.但是,您可以创建指向它的指针.
你给的例子是行不通的,因为你需要传递的一个实例struct a来get_b了,你不能创建的实例struct a.但是如果函数采用指针,你可以这样做:
int get_b(struct a *sa)
{
return sa->b;
}
Run Code Online (Sandbox Code Playgroud)
您还需要一个类似构造函数的函数来创建实例,因为外部模块将无法执行此操作:
struct a *create(int b)
{
struct a *tmp = malloc(sizeof(struct a));
tmp->b = b;
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
然后你的标题将包含:
struct a;
int get_b(struct a *);
struct a *create(int);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |