【问题标题】:How can i use longs as key in glib hash table?如何在 glib 哈希表中使用 long 作为键?
【发布时间】:2018-03-27 12:42:29
【问题描述】:

g_hash_table_new(HashFunc hash_func, GEqualFunc key_equal_func)

HashFunc 他们有这种类型:

  • g_direct_hash()
  • g_int_hash()
  • g_int64_hash()
  • g_double_hash()
  • g_str_hash()

GEqualFunc 他们有这种类型:

  • g_direct_equal()
  • g_int_equal()
  • g_int64_equal()
  • g_double_equal()
  • g_str_equal()

我可以使用哪种类型来拥有一个 long 的键和一个指向我已定义的结构的指针的值?

【问题讨论】:

  • 为什么不像手册上说的那样使用gconstpointer
  • gconstpointer中转了我的多头?
  • 假设您为一个指针至少与 long 一样多的系统构建,是的,您可以转换它并使用g_direct_*。否则:不要使用long,而是使用intint64_t 作为您的值并将指向它们的指针传递给g_int_*g_int64_*
  • 正如@marcolz 所说,为什么要使用long? long 与 int 相同或更大(取决于编译目标),所以如果你不使用 int 我假设是因为你知道 long 可能大于 int,这很可能是 int64_t。知道这一点,请按照 marcolz 的说明进行操作..
  • 在我的 .h 文件中我可以 #define G_MININT64 LONG_MIN#define G_MAXINT64 LONG_MAX 然后 int64 将等于 Long

标签: c hashtable glib


【解决方案1】:

来自cmets的总结:

假设您为一个指针至少与 long 一样多的系统构建(在大多数系统上为 true),是的,您可以将其转换为 gconstpointer 并使用 g_direct_*。不过,您确实会以这种方式将对该事实的依赖构建到您的代码中。

否则:不要使用long,而是使用gintgint64 作为您的值,并将指向它们的指针传递给g_int_*g_int64_*。在可移植代码中使用long(每个系统的实际大小可能不同)无论如何都不是很方便。

g_direct_* 使用指针本身而不是它们所指向的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多