【问题标题】:Variant datatype library for CC 的变体数据类型库
【发布时间】:2010-04-29 04:42:33
【问题描述】:

是否有一个像样的开源 C 库用于存储和操作
动态类型变量(又名变体)?我主要对原子值(int8、int16、int32、uint、字符串、blob 等)感兴趣,而 JSON 样式的数组和对象以及自定义对象也很好。这种库有用的一个主要案例是使用 SQL 数据库。

这种库最明显的特点是所有支持值的单一类型,例如:

struct Variant {
    enum Type type;
    union {
        int8_t int8_;
        int16_t int16_;
        // ...
    };
};

其他功能可能包括将 Variant 对象与 C 结构相互转换(使用绑定表)、将值与字符串相互转换,以及与现有数据库库(如 SQLite)集成。

注意:我不认为这个问题与 Any library for generic datatypes in C? 重复,它指的是“队列、树、地图、列表”。我所说的更侧重于使 SQL 数据库的使用与在解释语言中使用它们大致一样顺利。

【问题讨论】:

  • 变体? C为此使用void*...
  • @KennyTM:我不认为void* 是在 C 中模仿 PHP 的 sqlite_fetch_object 之类的函数的充分基础(无需编写/使用变体库或类似内容)。
  • 我不认为“原子”这个词意味着你认为它的意思。
  • @JXG:我不是指与多线程相关的“原子”的含义。我使用这个词的一般含义“不能被分解成部分”来指代没有像数组和字典那样的子节点的值(尽管你可以争辩说字符串有字符,整数有位,它们是较小的部分)。

标签: c variant c-libraries


【解决方案1】:

GLib 以 GValue 的形式实现了泛型值类型: http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html

【讨论】:

    【解决方案2】:

    虽然我怀疑原作者仍然需要答案(希望至少在 4 年后),但我想添加我的 2ct。

    首先,让我声明您要求的东西称为 sum-type 并且通常在函数式语言中受支持(也就是说,它是一种语言设计功能,而不是库问题)。

    其次,您能否找到适合这种情况的 C 库非常值得怀疑,原因很简单,任何此类库都支持一组可能不符合您需求的固定变体。

    不过,为了完整起见,您不妨试试msgpack

    【讨论】:

      【解决方案3】:

      我建议阅读有关 SQL 数据库连接器的手册。 MySQL 连接器提供了一个 API,用于获取 result 中的字段类型。

      您可以创建一个 Factory 函数来填充基于字段类型的结构。具有讽刺意味的是,由于 C 没有 Base 类型,因此您必须使用 void * 指针并重新转换为已知的结构类型。 (尽管 void * 是您想要摆脱的类型。)

      【讨论】:

      • 我通过创建一个绑定系统来设置void * 指针引用的变量,从而做了类似的事情。我不怕void *,我只想要一个简单的框架来处理 C 中的动态类型。
      【解决方案4】:

      C 是一种非常强类型的语言,变体不是其哲学的一部分。联合不能成为解决方案,因为您仍然必须选择要使用的数据类型,它通常用于在 intchar[4] 上存储颜色代码。

      如果你看 C-SQLite 接口,提供了这个功能:

      int sqlite_step(
        sqlite_vm *pVm,          /* The virtual machine to execute */
        int *pN,                 /* OUT: Number of columns in result */
        const char ***pazValue,  /* OUT: Column data */
        const char ***pazColName /* OUT: Column names and datatypes */
      );
      

      数据类型由 char* 表示,开发人员的任务是弄清楚如何从中获取类型。我认为任何一种变体类型都会更好,但它不是 C。 C 没有实现变体,也不打算这样做。

      【讨论】:

      • C 是静态类型,但不是“非常”强类型。
      • 没有强类型。一旦你在 void* 中引入强制转换,你就会在类型检查系统中打一个洞。 C 绝对不是强类型。
      • 正如其他人所说,关于“强类型”的部分是完全错误的。
      猜你喜欢
      • 2011-07-31
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 2023-04-07
      • 1970-01-01
      • 2020-01-14
      • 2016-04-13
      相关资源
      最近更新 更多