代码之家  ›  专栏  ›  技术社区  ›  Joey Adams

C的变量数据类型库

  •  7
  • Joey Adams  · 技术社区  · 14 年前

    是否有一个合适的开源c库来存储和操作
    动态类型变量(也称为变量)?我主要对原子值(int8、int16、int32、uint、strings、blob等)感兴趣,而json样式的数组和对象以及自定义对象也不错。这种库有用的一个主要情况是使用sql数据库。

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

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

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

    注:我不认为这个问题是 Any library for generic datatypes in C? ,它指的是“队列、树、地图、列表”。我所说的重点是使使用sql数据库的过程与使用解释性语言的过程大致相同。

    4 回复  |  直到 7 年前
        2
  •  3
  •   choeger    10 年前

    尽管我怀疑原作者 需要 一个答案(希望至少在4年后),我想加上我的2ct。

    首先,让我声明一下,您要求的是一个sum类型,通常在函数式语言中支持(也就是说,它是一个语言设计特性,而不是库问题)。

    其次,对于这种情况,您很难找到一个c库,原因很简单,任何这样的库都将支持一组可能不符合您需要的固定变体。

    然而,为了完整起见,您可能需要 msgpack 尝试一下。

        3
  •  0
  •   Thomas Matthews    14 年前

    我建议您阅读有关SQL数据库连接器的手册。mysql连接器提供了一个api,用于获取 结果 .

    你可以创建一个 工厂 基于字段类型填充结构的函数。具有讽刺意味的是,由于c没有基类型,因此必须使用 void * 指向已知结构类型的指针和重铸。(即使 空洞* 是你要摆脱的类型。)

        4
  •  -5
  •   Opera    14 年前

    c是一种非常强类型的语言,变体不是它的哲学的一部分。联合不能作为解决方案,因为您仍然必须选择要使用的数据类型,它通常用于存储颜色代码 int char[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不实现变体,也不打算实现。