【问题标题】:Find out if a typedef defines a specific type in C找出 typedef 是否定义了 C 中的特定类型
【发布时间】: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。我只是希望我的代码看起来更易于维护,而且我认为它不会在生产中使用。无论如何,谢谢你的回答!也许这实际上是一种过度设计。

标签: c typedef c11


【解决方案1】:

您代码中的变量将被优化掉,我强烈怀疑这段代码在优化后将是 100% 的编译时间。

不过,如果您不确定,您可以通过引入宏和静态断言来稍微调整它:

#define IS_INT(q) _Generic((q), int: true, default: false)
...

ListDataType q;
_Static_assert(IS_INT(q), "list data types other than int are not supported");

这是 100% 的编译时间和良好实践。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多