【发布时间】:2020-10-31 09:43:28
【问题描述】:
我必须在 C 中实现一个链表数据结构。在 "linked_list.h" 头文件中我有以下行:
typedef int ListDataType;
我的问题是,如果ListDataType 不等于int,我该如何终止程序?我知道如果不满足此要求,预处理器无法阻止我的程序编译(因为它对typedefs 一无所知)。
我用 C11 编码,我知道 _Generic 关键字。怎样才能避免写出下面这样的东西?
{
ListDataType q;
const bool kListDataTypeIsNotInt = _Generic(q, int: false, default: true);
if (kListDataTypeIsNotInt) {
print_error_message_and_exit("list data types other than int are not supported");
}
}
我应该改用宏 (#define LIST_DATA_TYPE int) 吗?
【问题讨论】:
-
如果你编写头文件并控制类型别名,你为什么要让它成为无效的东西?这样的检查能解决什么问题?
-
@Someprogrammerdude,例如,如果有人编辑我的代码以使用包含
char *的列表,这将防止代码出现不良行为。 -
有什么办法可以防止有人同时编辑支票?作为图书馆作者,您不能阻止图书馆的用户做愚蠢的事情。只需记住记录所有内容,并添加免责声明“如果您修改任何内容,那么您就靠自己了”(或类似内容)。然后,如果进行了此类更改的用户抱怨代码破坏,您可以回复!是您破坏了它,现在走开”(也许措辞更圆滑)。
-
为什么要避开
_Generic? -
@Someprogrammerdude,这是我大学任务的一部分,我的任务描述明确指出学生应该实现
ints 的列表。所以我主动介绍了ListDataType。我只是希望我的代码看起来更易于维护,而且我认为它不会在生产中使用。无论如何,谢谢你的回答!也许这实际上是一种过度设计。