以下是头文件的代码,想问下用“typedef void SeqList”这样写是啥意思呢?把“SeqLis”重命名为空类型?网上看了下是说什么封装,就是在 .c 文件下不能随意给SeqList定义的结构体里面 的对象进行赋值。求大神赐教!
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
typedef void SeqList;
typedef void SeqListNode;
SeqList* SeqList_Create(int capacity);
void SeqList_Destroy(SeqList* list);
void SeqList_Clear(SeqList* list);
int SeqList_Length(SeqList* list);
int SeqList_Capacity(SeqList* list);
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
SeqListNode* SeqList_Get(SeqList* list, int pos);
SeqListNode* SeqList_Delete(SeqList* list, int pos);
#endif
以下是.c文件的一部分代码。如果加上一句list ->length=0,程序则会报错,报错原因就是说在头文件里面用void对SeqListNode进行了封装。这是什么意思呢?
int main(int argc, char *argv[])
{
SeqList* list = SeqList_Create(5);
int i = 0;
int j = 1;
int k = 2;
int x = 3;
int y = 4;
int z = 5;
int index = 0;
typedef void SeqList; 给void起别名为 SeqList
typedef void SeqListNode;
这样做是为了使用者方便阅读,
SeqList* SeqList_Create(int capacity); //这样一看返回值就知道是返回值是链表
void * SeqList_Create(int capacity); //如果这样,使用者一看只知道是返回指针,不知道具体的,可读性很差
所以才会给void起别名,封装好的底层函数,提供给使用者使用,使用者会给容易懂
结合下面
SeqListNode*
来看,应该是都替换成void *,C不支持泛型,这么做估计是希望写成类型无关的意思。
C语言里面的typedef,字面上理解就是类型定义,也就是给内置的或自定义的数据类型重新命名。typedef void SeqList;typedef void SeqListNode;
就是给void类型重新命名,下面代码SeqListNode* 等价于void *。
相当于给void起别名,感觉没什么意义。。