8

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

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

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

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

注意:我不认为这个问题是C 中通用数据类型的任何库的副本?,指的是“队列、树、地图、列表”。我所说的更侧重于使 SQL 数据库的使用大致与在解释语言中使用它们一样顺畅。

4

4 回答 4

5

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

于 2010-06-14T22:57:34.777 回答
5

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

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

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

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

于 2014-12-19T00:37:11.413 回答
0

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

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

于 2010-04-29T22:28:51.020 回答
-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 */
);

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

于 2010-04-29T06:35:01.853 回答