我不是低级非面向对象编程语言的专家,我正在为工作中的项目编写一些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作为结构时,是否存在一般的“经验法则”?我们何时将它们定义为结构的指针?
答案 0 :(得分: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);
显然,这仅适用于接口头中的前向声明结构。
如果您没有首先隐藏结构实现,则在S1
和S2
之间进行选择是一个偏好(或一致性)问题。我不会使用S3
,除非它是一个非常不透明/隐藏的类型。
个人偏好是对大/复合聚合使用S1
(显式struct关键字),对于可能像值一样对待的小结构使用S2
而不是总是通过指针传递。因人而异。
答案 1 :(得分:1)
隐藏或不隐藏的决定完全取决于您作为图书馆的设计者。如果您希望将来保留随意更改struct
的权利,则不应将其任何成员公开给“全世界”。如果您首先提供struct
作为与图书馆通信的方式(例如,代表3D点的struct
),那么您无法将其成员隐藏在世界之外,因为它会打败这个目的。
答案 2 :(得分:1)
阅读Linus Torvalds post 第5章:Typedef