1

我正在处理来自哈希表的大量数字。考虑到可移植性,我想知道将它们添加到常量(100)中的好方法是什么。Glib 的文档强调使用 GINT_TO_POINTER 无论如何都不能移植。任何想法,将不胜感激!

gpointer v, old_key;
gint value; // ?

if(g_hash_table_lookup_extended(table, key, &old_key, &v)){
    value = GPOINTER_TO_INT(v); // ?
    value = value + 100;
}
g_hash_table_replace(table, g_strdup(key), GINT_TO_POINTER(value)); // ?
4

2 回答 2

5

我不熟悉 gnome 库,但来自GNOME 文档库

您不得以整数存储指针。这在任何形状或形式下都是不可移植的。这些宏只允许在指针中存储整数,并且只保留整数的 32 位;超出 32 位整数范围的值将被破坏。

唯一不可移植的是将指针存储在整数中。如果你只是:

  • 将整数存储在指针中。(不是整数指针)。
  • 整数不超过 32 位。

应该没问题的。

于 2010-08-17T04:50:47.400 回答
1

与其在指针中存储整数,不如让指针指向一个整数:

gpointer v, old_key;
int *int_v;
if(g_hash_table_lookup_extended(table, key, &old_key, &v)){
    int_v = (int *)v;
    int new_value = *int_v + 100;
    int_v = g_malloc(sizeof(int));
    *int_v = new_value;
}
g_hash_table_replace(table, g_strdup(key), int_v);

对于新值,请使用g_malloc

// ...
int *value = g_malloc(sizeof(int));
// ...
g_hash_table_insert(table, key, value);

为确保正确销毁键和值,请将析构函数传递g_freeg_hash_table_new_full.

于 2010-08-17T04:47:27.800 回答