在C,通用容器或安全容器?

时间:2012-04-29 05:37:29

标签: c containers idioms void-pointers generic-programming

在C ++中,您可以使用模板同时拥有通用容器和类型安全容器。但是在C中,如果你想要通用容器,你必须(afaik)使用void*,这意味着你失去了类型安全性。要拥有类型安全的容器,您必须为要保留的每种类型的数据重新实现它们。

鉴于C遵循的是比C ++更多的程序员知道他正在做什么哲学,在C中做什么更惯用的事情:使用{{1的通用容器或者为每种类型的数据制作自定义容器?

4 个答案:

答案 0 :(得分:3)

我的目标是使用通用容器:

  1. 一旦你习惯了它,你只会想到void *是什么意思,当我不关心它的类型。它就像Java中的Object - 很长一段时间,通用容器也没有类型安全性。

  2. 您只有一个地方需要改进。

  3. 你没有得到类型安全;但是,如果重复实现类型安全容器,则存在复制和粘贴错误的风险。这也可能导致错误。

答案 1 :(得分:1)

所以我快速搜索了一下C容器领域是否出现了任何新的聪明想法。

我找到了this。这是对完整C容器库的一次非常彻底的尝试。

它传递要包含在void *指针中的元素。没有尝试指定特定类型的结构。

对于类型安全,您可以为每个容器编写一个“包装器”宏,它定义了一个主机,如果内联函数包含无类型版本并提供类型安全性。希望它们会被编译器优化掉,但这并不总是可行的。而宏将是丑陋的

我想这就是为什么更多(应用程序)程序是用C ++而不是C编写的原因之一。在C中创建复杂抽象的能力是有限的。你可以这样做,但你通常会牺牲其他方面,如性能或可维护性(例如,查看一个C GTK程序)。

答案 2 :(得分:0)

要创建一个处理C语言中的通用数据的类型,您可以使用void*来传递数据。为每种可能的类型定义新算法是不切实际的。

答案 3 :(得分:0)

使用void*作为成员没有什么好处(除非编译时间最重要),你总是可以在适当的时候转换为void*,然后对无类型的数据blob进行操作必要时。

我在C中实现了这样的接口(例如,具有不同类型的命名字段的多个变体)。我倾向于使用类型安全性,并且在这些实现中很少发现向void*投射是一件好事。

...然后,我花了更多时间编写c ++而不是c:)