有没有一种方法可以将结构索引为 Glib 哈希表中的值?

Is there a way of indexing structures as values in Glib Hash Tables?

目前我正在尝试实现一个带有范围管理的符号表,用于将自定义语言解释为一门学校 project.My 问题是我对实现图书馆的知识知之甚少 containers.I 已经研究过油嘴滑舌了一段时间,我决定成为最合适的人选,我正在尝试将它用于我的 cause.But 我有一个问题是有没有一种方法可以使用结构作为键的值?

"using structs as value for keys"让我很困惑,你是说"using structs as keys"还是"using structs as values"?

您可以使用任何指针作为键或值; gpointervoid* 的类型定义。作为值的结构类似于

YourStruct* your_struct_new(void) {
  YourStruct* val = g_malloc0(sizeof(YourStruct));
  /* Any per-struct initialization goes here */
  return val;
}

void your_struct_free(YourStruct* val) {
  /* Free any members you need to */
  g_free(val);
}

void do_stuff(void) {
  GHashTable* ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, your_struct_free);

  /* Insert an entry */
  g_hash_table_insert(ht, g_strdup("Key"), your_struct_new());

  /* Free the hash table, including all entries */
  g_hash_table_unref(ht);
}

作为键的结构可能需要自定义 hash/equal 函数,除非您只想使用仅使用内存地址的 g_direct_hash。通常这就足够了,但如果不够,您基本上需要以某种方式从结构的内容生成一个 int。例如,如果您的结构有两个字符串成员,您可能需要

typedef struct {
  char* foo;
  char* bar;
} YourStruct;

guint your_struct_hash(YourStruct* val) {
  guint res = g_str_hash(val->foo);
  res |= g_str_hash(val->bar);
  return res;
}

/* return TRUE if a and b are equal, FALSE otherwise */
gboolean your_truct_equals(YourStruct* a, YourStruct* b) {
  if (g_strcmp0(a->foo, b->foo))
    return FALSE;
  if (g_strcmp0(a->bar, b->bar))
    return FALSE;

  return TRUE;
}

然后只需将它们传递给 g_hash_table_new_full 而不是 g_str_hashg_free 即可。当然,具体如何实现这些在很大程度上取决于你的数据结构是什么样的,所以没有更多信息,我只能告诉你。