【问题标题】:When should I typedef struct vs. pointer to struct?我什么时候应该 typedef struct 与指向 struct 的指针?
【发布时间】:2012-03-06 23:28:37
【问题描述】:

我不是低级非面向对象编程语言方面的专家,而且我正在为工作项目编写一些 C 代码。我正在尝试创建一些体面的抽象数据类型来使用,谷歌搜索让我意识到人们以两种方式使用基于结构的 ADT。有些人将数据类型定义为结构:

typedef struct adt {
    //content here
} adt;

并在头文件中向世界公开。

其他人将数据类型定义为 指针 到结构:

// In .c file:
typedef struct adt_s {
    //content here
} adt_s, *adt;


// In .h file:
typedef struct adt_s *adt;

我知道这种方法允许您在不向外界提供任何有关此结构内部内容的信息的情况下对结构进行类型定义,因此程序员可以使用同一头文件中提供的函数对其进行操作数据类型。

还有其他理由选择另一个吗?何时将 ADT 定义为结构以及何时将它们定义为指向结构的指针,是否有一般的“经验法则”?

【问题讨论】:

    标签: c struct typedef abstract-data-type


    【解决方案1】:

    您也可以在没有 typedef 的情况下转发声明一个结构 - 唯一的区别是:

    • 使用或不使用关键字struct,界面是否看起来更干净
    • 无论有没有显式指针*,界面是否看起来更干净

    例如。

    struct S1;
    typedef struct S2 S2;
    typedef struct S3_s *S3;
    
    void foo1(struct S1 *arg);
    void foo2(S2 *arg);
    void foo3(S3);
    

    显然这仅适用于接口头中的前向声明结构。

    如果您不是一开始就隐藏结构实现,那么在S1S2 之间进行选择是一个偏好(或一致性)问题。我不会使用S3,除非它是一个非常不透明/隐藏的类型。

    个人偏好是对大/复杂聚合使用S1(显式结构关键字),对小型结构使用S2,您可能会将其视为类似值而不总是通过指针传递。 YMMV。

    【讨论】:

    • 为了便于阅读,也许最好写typedef struct S3_s* S3而不是typedef struct S3_s *S3,不是吗?
    • @Eregrith:如果你按照形式语言语义,typedef struct S3_s *S3 表示声明符*S3 具有类型struct S3_s 和存储类typedef,因此将星号与标识符放在一起实际上是惯用语;但是,将星号与类型放在一起更符合有多少(大多数?)人考虑声明;就我而言,只要您保持一致,两个版本都可以...
    • 我刚刚选择了该间距以与 OP 保持一致,因为无论哪种方式我都能看到好处。
    【解决方案2】:

    隐藏或不隐藏的决定完全取决于您作为图书馆的设计者。如果您想保留将来随意更改您的struct 的权利,您不应将其任何成员暴露给“世界”。如果您首先提供struct 作为与您的图书馆进行通信的方式(例如,struct 代表 3D 中的一个点),那么您不能将其成员隐藏在世界之外,因为它会破坏目的.

    【讨论】:

      【解决方案3】:

      阅读 Linus Torvalds post 第 5 章:类型定义

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多