我决定让静态库实现带有功能的双链表。它的头文件现在是这样的:
#ifndef LISTS
#define LISTS
#define LIST {0, NULL, NULL}
typedef struct node node;
typedef struct list {
unsigned int length;
node *beginning;
node *end;
} list;
void listAppend(list *list, int value);
int listPop(list *list);
char listRemove(list *list, int value);
void listPrint(list *list);
void listClear(list *list);
#endif
即。用户应使用list myList = LIST;
初始化列表。
我可以阻止list.length在用户list.length++
等代码中随意更改吗?
答案 0 :(得分:1)
通常,如果要在纯C中隐藏客户端的实现,可以使用指向不完整类型的指针。为此,您在.h文件中提出结构的声明,并在* .c文件中提供完整声明。您甚至不能将字面值零添加到指向不完整类型的指针,更不用说取消引用它和/或更改某些数据。
另外,如果你想要克服一切困难并将你的列表标题放在堆栈上,你可能想在alloca()周围写一个宏,但是我不知道如何计算* .h文件中结构的大小,而不在范围内声明。它可能通过extern const
,但恕我直言,它太复杂了。