防止改变c的价值

时间:2018-01-21 15:56:32

标签: c struct static-libraries

我决定让静态库实现带有功能的双链表。它的头文件现在是这样的:

#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++等代码中随意更改吗?

1 个答案:

答案 0 :(得分:1)

通常,如果要在纯C中隐藏客户端的实现,可以使用指向不完整类型的指针。为此,您在.h文件中提出结构的声明,并在* .c文件中提供完整声明。您甚至不能将字面值零添加到指向不完整类型的指针,更不用说取消引用它和/或更改某些数据。

另外,如果你想要克服一切困难并将你的列表标题放在堆栈上,你可能想在alloca()周围写一个宏,但是我不知道如何计算* .h文件中结构的大小,而不在范围内声明。它可能通过extern const,但恕我直言,它太复杂了。