C的变体数据类型库

时间:2010-04-29 04:42:34

标签: c variant c-libraries

是否有一个像样的开源C库来存储和操作
动态类型变量(a.k.a. variants)?我主要对原子值(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数据库与在解释语言中使用它们一样顺利。

4 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

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

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

其次,您会为该案例找到一个C库是非常值得怀疑的,原因很简单,任何此类库都会支持一组可能不符合您需求的固定变体。

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

答案 2 :(得分:0)

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

您可以创建一个 Factory 函数,该函数根据字段类型填充结构。具有讽刺意味的是,由于C没有Base类型,因此您必须使用void *指针并重新构造已知的结构类型。 (尽管void *是你试图摆脱的类型。)

答案 3 :(得分:-5)

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没有实现变体,也不是意图。