今天我开始研究FUSE开源代码,我发现这样的几行:
struct fuse_session;
struct fuse_chan;
我不知道如何解释它,据我所知'struct
'后跟结构名称,然后是变量名称。在这种情况下,只有一个命名实体后跟struct
,所以这个融合会话本身就是结构变量或结构名称。它可能是一些非常基本的东西,但我无法在任何地方找到它。
答案 0 :(得分:10)
这通常用于以下之一:
您希望让某个模块的用户知道此结构存在,但不希望公开它的内容。例如:
在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
运算符,只声明指向结构的指针。
答案 1 :(得分:2)
这些是不完整类型或不透明类型,当库接口仅适用于指向这些类型的指针时,它们非常有用。您不需要填写结构中所有内容的所有细节,因此库外的任何代码都无法访问结构中的数据(合法地)。库中的代码有一个私有头,它提供了结构中的内容的详细信息,因此库确实可以处理内容,但这是一个隐藏在库的使用者身上的细节。
不完整类型提供比有时使用的另一种替代方案(即void指针)更好的类型安全性。当有多种不同类型都由“void *
”表示时,很容易混淆。对于不完整的类型,您可以正确区分不同的类型,但仍然没有透露它们如何实现的细节。
答案 2 :(得分:2)
您应该在forward declaration
中了解C
。请尝试this链接。
答案 3 :(得分:0)
我在某些库的API提供的头文件中找到了这样的东西。有些库不希望公开库中使用的某些结构的成员细节,但是他们打算让应用程序将这些结构用作指针,在这种情况下它们会如图所示这样做......
答案 4 :(得分:0)
Forward Declaration
这有助于编译器解析程序不同部分的结构引用。