【问题标题】:How to interpret structure without definition?如何解释没有定义的结构?
【发布时间】:2011-12-26 06:23:21
【问题描述】:

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

struct fuse_session;
struct fuse_chan;

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

【问题讨论】:

    标签: c open-source structure fuse


    【解决方案1】:

    这通常用于以下之一:

    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操作符,只能声明一个指向结构的指针。

    【讨论】:

    • @user1115935,这也叫前向声明。
    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    您应该在C 中获得对forward declaration 的介绍。请尝试this链接。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2012-07-28
          • 1970-01-01
          • 2010-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-10
          • 1970-01-01
          相关资源
          最近更新 更多