C - Glib GINT_TO_POINTER 可移植性

发布于 2024-09-14 14:58:10 字数 377 浏览 6 评论 0原文

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

I'm dealing with large numbers coming from the hash table. I'm wondering what would be a good way of adding them to a constant (100) taking into account portability. Glib's documentation highlights that using GINT_TO_POINTER is not portable in any way. Any ideas would be appreciated!

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)); // ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

空城仅有旧梦在 2024-09-21 14:58:10

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

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

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

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

应该没问题的。

I am not familiar with gnome library, but from GNOME Documentation Library:

YOU MAY NOT STORE POINTERS IN
INTEGERS.
THIS IS NOT PORTABLE IN ANY
WAY SHAPE OR FORM. These macros ONLY
allow storing integers in pointers,
and only preserve 32 bits of the
integer;
values outside the range of a
32-bit integer will be mangled.

The only thing not portable is to store pointers in integers. If you just:

  • Store integers in pointers. (not pointers in integer).
  • The integer does not not exceed 32 bits.

It shall be okay.

优雅的叶子 2024-09-21 14:58:10

不要将整数存储在指针内,而是让指针指向整数:

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< /code> 到 g_hash_table_new_full

Rather than storing an integer inside a pointer, have the pointer point to an integer:

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);

For a new value, use g_malloc:

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

To ensure keys and values are destroyed properly, pass destructor functions like g_free to g_hash_table_new_full.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文