C语言中的指针类型属于原子类型,C的变体数据类型库

是否有一个像样的开源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绝对不是强类型。

正如其他人所说,关于"强类型"的部分是完全错误的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值