首页 文章

我应该什么时候输入structdef struct to指向struct?

提问于
浏览
8

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

typedef struct adt {
    //content here
} adt;

并在头文件中将其公开给世界 .

其他人将数据类型定义为struct的指针:

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


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

我知道这种方法允许你键入一个结构,而不给外界任何关于这个结构内部的知识,所以程序员只能使用同一个头文件中提供的函数来操作这个数据类型 .

是否有其他理由可以选择另一个?当定义ADT作为结构时,是否存在一般的“经验法则”?我们何时将它们定义为结构的指针?

3 回答

  • 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 并不总是通过指针传递 . 因人而异 .

  • 6

    隐藏或不隐藏的决定完全取决于您作为图书馆的设计者 . 如果您希望将来保留随意更改 struct 的权利,则不应将其任何成员公开给"the world" . 如果您首先提供 struct 作为与图书馆通信的方式(例如, struct 代表3D中的一个点),那么您无法将其成员隐藏在世界之外,因为它会破坏目的 .

  • 1

    阅读Linus Torvalds post第5章:Typedef

相关问题