C的Variant数据类型库

Joe*_*ams 7 c variant c-libraries

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

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

struct Variant {
    enum Type type;
    union {
        int8_t int8_;
        int16_t int16_;
        // ...
    };
};
Run Code Online (Sandbox Code Playgroud)

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

注意:我不相信这个问题是C中通用数据类型任何库的重复吗?,指的是"队列,树木,地图,名单".我所谈论的内容更多地侧重于使用SQL数据库与在解释语言中使用它们一样顺畅.

cho*_*ger 5

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

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

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

但是,为了完整起见,您可能想尝试一下msgpack


小智 -4

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 */
);
Run Code Online (Sandbox Code Playgroud)

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

  • C 是*静态*类型的,但不是“非常”强类型的。 (3认同)
  • 没有强打字。一旦你在 void* 之间引入了铸造,你就在类型检查系统中留下了一个洞。C 绝对不是强类型。 (3认同)