防止值在 c 上发生变化
Prevent value from changing on c
我决定做一个静态库,用函数实现双向链表。现在它的头文件是这样的:
#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++
那样被用户随意更改他的代码吗?
通常,如果您想在纯 C 中对客户端隐藏实现,您可能会使用指向不完整类型的指针。为此,您在 .h 文件中提出结构声明,并在 *.c 文件中提出完整声明。您甚至不能将文字零添加到指向不完整类型的指针,更不用说取消引用它 and/or 更改一些数据。
此外,如果您想克服一切困难将列表的 header 放入堆栈,您可能想围绕 alloca() 编写一个宏,但我不确定如何计算*.h 文件中结构的大小,而没有在范围内声明。可以通过 extern const
,但恕我直言,它太复杂了。
我决定做一个静态库,用函数实现双向链表。现在它的头文件是这样的:
#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++
那样被用户随意更改他的代码吗?
通常,如果您想在纯 C 中对客户端隐藏实现,您可能会使用指向不完整类型的指针。为此,您在 .h 文件中提出结构声明,并在 *.c 文件中提出完整声明。您甚至不能将文字零添加到指向不完整类型的指针,更不用说取消引用它 and/or 更改一些数据。
此外,如果您想克服一切困难将列表的 header 放入堆栈,您可能想围绕 alloca() 编写一个宏,但我不确定如何计算*.h 文件中结构的大小,而没有在范围内声明。可以通过 extern const
,但恕我直言,它太复杂了。