5

今天我开始研究 FUSE 开源代码,我发现有几行是这样的:

struct fuse_session;
struct fuse_chan;

我不知道如何解释它,据我所知,' struct'后面是结构名称,然后是变量名称。在这种情况下,只有一个命名实体后跟struct,所以这个熔断会话是结构变量或结构名称本身。它可能是一些非常基本的东西,但我无法在任何地方找到它。

4

5 回答 5

11

这通常用于以下情况之一:

  1. 你想让某个模块的用户知道这个结构存在,但不想暴露它的内容。例如:

    在 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;
    }
    

    这样您就可以封装实现,并且可以在以后根据需要更改结构,而不会对使用模块产生任何影响。

  2. 您想在声明之前使用结构(指针)。例如:

    struct bar;
    typedef int (*FooFuncType)(struct bar *);
    struct bar {
        FooFuncType a_func;        
    };
    

一个重要的注意事项:

如果你只有结构声明,就像你的问题一样,你不能直接引用结构,也不能使用sizeof运算符,只能声明一个指向结构的指针。

于 2011-12-26T06:27:57.697 回答
2

这些是不完整类型或不透明类型,当库接口仅使用指向这些类型的指针时它们很有用。您无需填写结构中内容的所有详细信息,因此库外的任何代码都无法访问结构中的数据(合法地)。库中的代码有一个私有标头,提供结构中内容的详细信息,因此库确实可以处理内容,但这是对库的使用者隐藏的细节。

与有时使用的另一种替代方法(即 void 指针)相比,不完整类型提供了更好的类型安全性。当有多种不同的类型都用''表示时,很容易混淆void *。对于不完整的类型,您可以正确区分不同的类型,但仍不能透露它们如何实现的细节。

于 2011-12-26T06:47:40.510 回答
2

你应该得到forward declarationin的介绍C。请试试这个链接。

于 2011-12-26T07:16:04.097 回答
0

我在一些库的 API 提供的头文件中发现了这样的东西。某些库不想公开库中使用的某些结构的成员详细信息,但他们打算让应用程序可以将这些结构用作指针,在这种情况下,他们会这样做...

于 2011-12-26T06:31:49.053 回答
0

Forward Declaration这有助于编译器解析来自程序不同部分的结构引用。

于 2011-12-26T07:23:36.047 回答