如何在C中动态创建和读取结构?

我怎么能做那样的事情(只是一个例子):

any_struct *my_struct = create_struct(); add_struct_member(my_struct, "a", int_member); add_struct_member(my_struct, "b", float_member); 

这样我就可以在这里使用给定的结构加载和使用“从外部”(在地址addressOfMyStruct )的结构实例?

 any_struct_instance *instance = instance(my_struct, addressOfMyStruct); int a = instance_get_member(instance, "a"); float b = instance_get_member(instance, "b"); 

我也希望能够以这种方式动态创建结构实例。

我希望我很清楚我想做什么。 我知道C / Invoke能够做到这一点,但有没有一个单独的库可以做到这一点?

实际上,演示用C语言进行这项工作的代码对于SOpost来说有点过分了。 但解释基本概念是可行的。

你在这里真正创造的是一个模板化的财产袋系统。 你需要做很多事情才能保持这种状态,这是一种像哈希表这样的相关结构。 我会说使用std :: map,但你提到这是一个只有C的解决方案。 为了讨论起见,我只是假设你有一些哈希表。

“create_struct”调用需要返回一个结构,该结构包含一个指向散列表的指针,该散列表使const char*基本上为size_t。 此映射定义了为创建结构的新实例所需的内容。

“insance”方法实际上将创建一个具有相同数量的成员的新哈希表作为模板哈希表。 让懒惰的evualation抛出窗口一秒钟,并假设你预先创建所有成员。 该方法需要遍历模板散列表,为每个条目添加一个成员,并对指定大小的内存块进行malloc。

instance_get_member的实现只是按名称在地图中进行查找。 虽然签名和使用模式需要改变。 C不支持模板,必须选择可以表示所有数据的公共返回类型。 在这种情况下,您需要选择void*因为这是内存需要存储的方式。

 void* instance_get_member(any_struct_instance* inst, const char* name); 

您可以通过添加envil宏来模拟模板,从而使其更好一些

 #define instance_get_member2(inst, name, type) \ *((type*)instance_get_member((inst),(name))) ... int i = instance_get_member2(pInst,"a", int); 

你到目前为止已经定义了所有剩下的问题(在某些部分略微棘手)实现。 您只需要跟踪信息:

 typedef struct { fieldType type; char name[NAMEMAX]; /* anything else */ } meta_struct_field; typedef struct { unsigned num_fields; meta_struct_field *fields; /* anything else */ } meta_struct; 

然后create_struct()meta_struct分配内存并将其初始化为0, add_struct_member() realloc()my_struct.fields上执行alloc() / realloc()并递增my_struct.num_fields 。 其余部分也是如此。

您还需要meta_struct_fieldunion来保存实例中的实际值。

很久以前我做了一些这样的事情。

我这样做的方法是生成包含结构定义的代码,以及用于访问它的所有例程,然后编译并将其“动态”链接到DLL中,然后动态加载该DLL。