我正在通过C Interfaces and Implementation
通过一本名为David R. Hanson
的书来学习。关于他给出的List ADT有一些我无法理解的想法。
我们按如下方式定义List类型:
#ifndef LIST_INCLUDED
#define LIST_INCLUDED
#define T List_T
typedef struct T *T;
struct T {
T rest;
void *first;
};
在这里,我可以看到List是以我熟悉的头尾方式构建的。我看到List_T是一个指向结构的指针,该结构被定义为保存相关的节点数据而T是别名。我没有得到的部分是,C编译器不会因为结构名称和指向它的指针名称使用相同类型名称T而感到困惑吗?我将在实现中使用的内容如下:
typedef struct List* list_t;
struct List {
list_t rest;
void *first;
};
因此struct和typedefed指针类型的名称与该结构的名称不同。两者都正常工作吗?
此外,David R. Hanson
还说明了此列表定义:
List_T是指向结构List_T的指针。大多数ADT隐藏其类型的表示细节。列表显示这些细节,因为为此 特别是ADT,替代品引起的并发症超过了 这样做的好处......揭示List_T的表示以多种方式简化了界面及其使用。例如,可以静态定义和初始化struct List_T类型的变量,这对于在编译时构建列表非常有用,并且可以避免分配。同样,其他结构可以嵌入struct List_Ts。
这个ADT如何揭示它的内部结构?我的意思是,这不是所有的AD中的ADT吗?据我所知,C没有内置的数据隐藏机制。这与我们静态初始化这个结构并嵌入其他结构的能力有何关系?
注意:我查看了很多元帖子,看看如果我要从一本书中发布一部分源代码,应该遵循什么准则。我找不到任何澄清。但我认为应该没问题,因为代码是在MIT许可下分发的。如果这有问题,请通知我。