【问题标题】:How to typedef a forward declaration?如何 typedef 前向声明?
【发布时间】:2019-04-27 13:47:18
【问题描述】:

在声明要在我的代码中使用的一些结构时,我需要帮助。这个想法是我需要声明一些相互包含的结构并使用 typedef 来拥有良好的编码风格。

我已尝试声明这些:

typedef struct cell
{
    T_Tree list_of_sons;
    struct cell *next;
}ListCell, *T_List, **Adr_List;

typedef struct node
{
    int value;
    T_List list;
}Node, *T_Tree;

它不起作用,因为之前没有声明类型“T_Tree”,但我想找到一种方法来声明它们,同时保持上面显示的类型定义。

【问题讨论】:

    标签: c struct typedef


    【解决方案1】:

    从不(函数指针除外)隐藏 typedef-s 中的指针。它使代码更容易出错且难以阅读(您不知道何时看到声明是否为指针)。

    struct node;
    
    typedef struct cell
    {
        struct node *list_of_sons;
        struct cell *next;
    }ListCell;
    
    typedef struct node
    {
        int value;
        ListCell *list;
    }Node;
    

    【讨论】:

    • 从不是一个强词。在其他时候,您想要对结构进行 typedef。特别是,如果您希望结构不透明并强制用户始终使用 API。例如stdio.h 中的文件;内存池的实现,或者从内核返回的文件描述符。
    • @AhmedMasud FILE 在 stdio 中不是指针。 FILE *fp; fp = fopen (.....) 只有糟糕的 Windows 设计才会导致 SHANDLE 和其他怪物。隐藏指针是 IMO 在 C 语言中最糟糕的做法之一。
    • 我也同意。我认为只有当某些东西的实际类型可能不同时,才使用 typedefs 才有意义。否则,我还没有看到很多 typedef 使代码更易于维护的情况。
    【解决方案2】:

    在第一个声明之前插入typedef struct node *T_Tree;。然后从最后的声明中删除T_tree

    这将T_Tree 声明为指向struct node 的指针。即使struct 没有完整的定义,您也可以声明指向struct 的指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-19
      • 2018-11-02
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多