如何解释结构没有定义?

时间:2011-12-26 06:23:21

标签: c open-source structure fuse

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

struct fuse_session;
struct fuse_chan;

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

5 个答案:

答案 0 :(得分:10)

这通常用于以下之一:

  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;        
    };
    
  3. 一个重要的注意事项:

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

您应该在forward declaration中了解C。请尝试this链接。

答案 3 :(得分:0)

我在某些库的API提供的头文件中找到了这样的东西。有些库不希望公开库中使用的某些结构的成员细节,但是他们打算让应用程序将这些结构用作指针,在这种情况下它们会如图所示这样做......

答案 4 :(得分:0)

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