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

Pho*_*non 8 c struct typedef abstract-data-type

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

typedef struct adt {
    //content here
} adt;
Run Code Online (Sandbox Code Playgroud)

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

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

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


// In .h file:
typedef struct adt_s *adt;
Run Code Online (Sandbox Code Playgroud)

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

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

Use*_*ess 6

你可以转发声明一个没有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);
Run Code Online (Sandbox Code Playgroud)

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

如果您没有首先隐藏结构实现,则在两者之间进行选择S1并且S2是一个偏好(或一致性)的问题.我不会使用,S3除非它是一个非常不透明/隐藏的类型.

个人偏好是S1对大/复合聚合使用(显式结构关键字),S2对于小结构,您可能会像值一样对待并且不总是通过指针传递.因人而异.