是否有一个像样的开源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数据库的使用与使用解释语言的SQL数据库一样平滑的工作上。
变体? C为此使用void* ...
@KennyTM:我不认为void*是在C中模仿PHPs sqlite_fetch_object之类的功能的适当基础(无需编写/使用变体库或类似库)。
我认为"原子"一词并不意味着您认为的含义。
@JXG:我不是指与多线程关联的"原子"的含义。 我使用的一般含义是"不能分解成几部分"来表示没有像数组和字典那样的子节点的值(尽管您可以说字符串有字符,整数有位,这是较小的部分)。
GLib以GValue的形式实现了通用值类型:
http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html
尽管我怀疑原始作者是否仍需要答案(希望至少在4年后),但我想添加2ct。
首先,让我指出,您要求的东西称为求和类型,通常在功能语言中受支持(也就是说,它是语言设计功能,而不是库问题)。
其次,对于这种情况,您会发现一个C库很可疑,原因很简单,因为任何这样的库都支持一组固定的变体,这些变体可能不符合您的需求。
但是,出于完整性考虑,您可能想尝试一下msgpack。
我建议阅读有关SQL数据库连接器的手册。 MySQL连接器提供了一个API,用于获取结果中的字段类型。
您可以创建一个Factory函数,以根据字段类型填充结构。具有讽刺意味的是,由于C没有基本类型,因此您必须使用void *指针并将其重铸为已知的结构类型。 (即使void *是您要摆脱的类型。)
我通过创建一个绑定系统设置了void *指针引用的变量,从而完成了与此类似的操作。 我不怕void *,我只想要一个简单的框架来处理C中的动态类型。
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没有实现变体,也没有意图。
C是静态类型的,但不是"非常"强类型的。
没有强类型。 一旦在void *中引入了铸造,或在void *中引入了铸造,就可以在类型检查系统中开孔。 C绝对不是强类型。
正如其他人所说,关于"强类型"的部分是完全错误的。