C - Glib GINT_TO_POINTER可移植性

时间:2010-08-17 04:13:36

标签: c performance portability glib

我正在处理来自哈希表的大量数字。我想知道将它们添加到常量(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)); // ?

2 个答案:

答案 0 :(得分:5)

我不熟悉gnome库,但是来自GNOME Documentation Library

  

你可能不会存入指针   INTEGERS。这在任何情况下都不是便携式的   方式或形式。 仅限这些宏   允许在指针中存储整数,   并且只保留32位   整数; 超出范围的值   32位整数将被破坏。

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

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

没关系。

答案 1 :(得分:0)

不是在指针中存储整数,而是将指针指向整数:

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_free)传递给g_hash_table_new_full