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

标签 c struct

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

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能够做到这一点,但是否有单独的库来做到这一点?

最佳答案

实际上,对于 SO 帖子来说,在 C 中演示使这项工作起作用的代码有点复杂。但是解释基本概念是可行的。

您在这里真正创建的是一个模板化的属性包系统。要保持这种状态,您需要大量的一件事是一些关联结构,例如哈希表。我会说用 std::map 去,但你提到这是一个只有 C 的解决方案。为了便于讨论,我假设您有某种可用的哈希表。

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

“insance”方法实质上将创建一个新的哈希表,其成员数量与模板哈希表相同。让我们暂时将惰性求值抛到脑后,假设您预先创建了所有成员。该方法将需要遍历模板哈希表,为每个条目添加一个成员,并分配指定大小的内存块。

instance_get_member 的实现将简单地按名称在 map 中进行查找。不过,签名和使用模式需要更改。 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);

关于c - 如何在 C 中动态创建和读取结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/777689/

相关文章:

c - 在我的 Xcode 项目中组织 C 代码

C 链表访问问题

c - 假设我们有一个非常大的结构在分配时占用巨大的内存空间

c++ - 复制简单结构时 memcpy 和 '=' 之间的区别

c - 尝试在 XCode 中编写基本的 C 程序,但我一直收到错误提示 'Expected expression'

c - mingw 问题 "stddef.h :no such file or directory"

C API : why are functions using returnParameters with buffer + size instead of returning char*

c - C 中不寻常的结构定义

c - 为什么在以下代码中将成员 y 设置为 0?

c - 结构困惑