在C ++中,您可以使用模板同时拥有通用容器和类型安全容器。但是在C中,如果你想要通用容器,你必须(afaik)使用void*
,这意味着你失去了类型安全性。要拥有类型安全的容器,您必须为要保留的每种类型的数据重新实现它们。
鉴于C遵循的是比C ++更多的程序员知道他正在做什么哲学,在C中做什么更惯用的事情:使用{{1的通用容器或者为每种类型的数据制作自定义容器?
答案 0 :(得分:3)
我的目标是使用通用容器:
一旦你习惯了它,你只会想到void *
是什么意思,当我不关心它的类型。它就像Java中的Object
- 很长一段时间,通用容器也没有类型安全性。
您只有一个地方需要改进。
你没有得到类型安全;但是,如果重复实现类型安全容器,则存在复制和粘贴错误的风险。这也可能导致错误。
答案 1 :(得分:1)
所以我快速搜索了一下C容器领域是否出现了任何新的聪明想法。
我找到了this。这是对完整C容器库的一次非常彻底的尝试。
它传递要包含在void *
指针中的元素。没有尝试指定特定类型的结构。
对于类型安全,您可以为每个容器编写一个“包装器”宏,它定义了一个主机,如果内联函数包含无类型版本并提供类型安全性。希望它们会被编译器优化掉,但这并不总是可行的。而宏将是丑陋的。
我想这就是为什么更多(应用程序)程序是用C ++而不是C编写的原因之一。在C中创建复杂抽象的能力是有限的。你可以这样做,但你通常会牺牲其他方面,如性能或可维护性(例如,查看一个C GTK程序)。
答案 2 :(得分:0)
要创建一个处理C语言中的通用数据的类型,您可以使用void*
来传递数据。为每种可能的类型定义新算法是不切实际的。
答案 3 :(得分:0)
使用void*
作为成员没有什么好处(除非编译时间最重要),你总是可以在适当的时候转换为void*
,然后对无类型的数据blob进行操作必要时。
我在C中实现了这样的接口(例如,具有不同类型的命名字段的多个变体)。我倾向于使用类型安全性,并且在这些实现中很少发现向void*
投射是一件好事。
...然后,我花了更多时间编写c ++而不是c:)