- 主题:C可以做泛型吗?
真实数据访问实现中要考虑了类型的对齐,大小
addr, [<type, align, size>, ...]
把这些信息和内存地址作为参数传入,应该就能实现你需要的能力
【 在 ylh1969 的大作中提到: 】
: 反射是指在通用的程序中,处理任意struct的能力。
: 比如,将任意的struct序列化。
: 这这需要知道struct的成员,名称,类型,长度,位置。
: ...................
--
FROM 120.231.170.*
他说的不是预先定义的数据结构体
比如通过socket接收到110字节,如何在接收端转换成它发送端的结构并访问其中的成员
这就要知道这110字节包含多少字段,每个字段类型大小对齐方式等等
才能实现特定字段的访问
【 在 freyoneby 的大作中提到: 】
: C语言不知道struct的信息?你是指只生声明了一个指针?还是不懂,有来段简单代码
: - 来自 水木社区APP v3.5.7
--
FROM 120.231.170.*
数据的反射信息在c里也可以生成,
做一个解析器,或者手动完成,对代码中的结构体定义
struct {
int a;
char b;
} dummy_t;
根据上下文的对齐规则和数据大小规则,生成类似这个结构
meta meta_dummy_t[3]={ TYPE_INT, ALIGN_4, SIZE_4, MD5_NAME(a),
TYPE_CHAR, ALIGN_4, SIZE_4,MD5_NAME(b),
NULL, NULL, NULL,MD%_NAME(0)};
在发生数据交互时,可以交互这个数据的元数据
(dummy_t*)get_data
(meta*)get_data_meta
跨平台使用是个麻烦,打包int是按照4字节打包,假如目标只接受
8字节对齐int数据访问;这时候需要根据获取的meta_dummy_t改造
当前平台的数据结构布局,并实现赋值;还有一个要注意的是在不同
大小端架构上交换位域数据结构体时顺序也是要转换的
【 在 ylh1969 的大作中提到: 】
: 难点是计算offset。
: struct的offset比较好算,class的,我不会算,只能等着反射来解决了。
: 效率问题,计算一次即可,之后的使用就不必算了。
: ...................
--
FROM 120.231.170.*
和语言没关系,如果编译期确定知道传输的数据结构,那没什么问题
现在是在运行时实现调用者传入一个数据,只有地址和大小,
类似proc_data (void* addr, size_t size)
这个函数又想通过数据的元素位置或者名称实现访问
需要一个和当前数据结构对应的元数据表来实现
prop_at(2),name_of(xx),offset_of(xx)
等等这一类泛化的数据项访问
【 在 dreamr 的大作中提到: 】
: 直接用c++ 有什么不妥吗?
--
FROM 120.231.170.*