【问题标题】:In C, Generic Containers or Safe Containers?在 C 中,通用容器还是安全容器?
【发布时间】:2012-05-09 08:14:45
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 好吧,你只需要定义你需要的算法。但我明白你在说什么。
    • @PaulManta:是的,我要脱离应该处理任意类型的容器示例。
    【解决方案2】:

    使用void* 作为成员并没有真正的好处(除非编译时间是最重要的),您始终可以在适当的情况下转换为void*,然后在必要时对无类型数据块进行操作。

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

    ...再说一次,我写 c++ 的时间比写 c 的时间多:)

    【讨论】:

      【解决方案3】:

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

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

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

      为了类型安全,您可以为每个容器编写一个“包装器”宏,它定义了一个宿主 if 内联函数,该函数环绕无类型版本并提供类型安全。希望它们会被编译器优化掉,但这并不总是可能的。而且宏会

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

      【讨论】:

      • 加上C11新的_Generic关键字,这些宏其实应该不会太难看。 Clang 已经实现了这一点,gcc 也有足够的特性来模拟它。
      【解决方案4】:

      我的目标是通用容器:

      1. 一旦你习惯了它,你就会认为void * 是指某事物的类型,而我并不关心它的类型。这就像 Java 中的 Object ——长期以来,通用容器也没有类型安全性。

      2. 你只有一个地方可以改进。

      3. 你没有得到类型安全;但是随着类型安全容器的重复实现,您将面临复制和粘贴错误的风险。这也可能导致错误。

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        相关资源
        最近更新 更多