今天我开始研究 FUSE 开源代码,我发现有几行是这样的:
struct fuse_session;
struct fuse_chan;
我不知道如何解释它,据我所知,' struct
'后面是结构名称,然后是变量名称。在这种情况下,只有一个命名实体后跟struct
,所以这个熔断会话是结构变量或结构名称本身。它可能是一些非常基本的东西,但我无法在任何地方找到它。
今天我开始研究 FUSE 开源代码,我发现有几行是这样的:
struct fuse_session;
struct fuse_chan;
我不知道如何解释它,据我所知,' struct
'后面是结构名称,然后是变量名称。在这种情况下,只有一个命名实体后跟struct
,所以这个熔断会话是结构变量或结构名称本身。它可能是一些非常基本的东西,但我无法在任何地方找到它。
这通常用于以下情况之一:
你想让某个模块的用户知道这个结构存在,但不想暴露它的内容。例如:
在 api.h 中:
struct bar;
void GetStruct(struct bar *);
void SetActive(struct bar *, char);
在您的内部文件中:
struct bar {
char is_active;
};
void GetStruct(struct bar * st) {
st = malloc(sizeof(struct bar));
}
void SetActive(struct bar * st, char active) {
if (st != NULL)
st->is_active = active;
}
这样您就可以封装实现,并且可以在以后根据需要更改结构,而不会对使用模块产生任何影响。
您想在声明之前使用结构(指针)。例如:
struct bar;
typedef int (*FooFuncType)(struct bar *);
struct bar {
FooFuncType a_func;
};
一个重要的注意事项:
如果你只有结构声明,就像你的问题一样,你不能直接引用结构,也不能使用sizeof
运算符,只能声明一个指向结构的指针。
这些是不完整类型或不透明类型,当库接口仅使用指向这些类型的指针时它们很有用。您无需填写结构中内容的所有详细信息,因此库外的任何代码都无法访问结构中的数据(合法地)。库中的代码有一个私有标头,提供结构中内容的详细信息,因此库确实可以处理内容,但这是对库的使用者隐藏的细节。
与有时使用的另一种替代方法(即 void 指针)相比,不完整类型提供了更好的类型安全性。当有多种不同的类型都用''表示时,很容易混淆void *
。对于不完整的类型,您可以正确区分不同的类型,但仍不能透露它们如何实现的细节。
你应该得到forward declaration
in的介绍C
。请试试这个链接。
我在一些库的 API 提供的头文件中发现了这样的东西。某些库不想公开库中使用的某些结构的成员详细信息,但他们打算让应用程序可以将这些结构用作指针,在这种情况下,他们会这样做...
Forward Declaration
这有助于编译器解析来自程序不同部分的结构引用。