将GPOINTER_TO_INT and GINT_TO_POINTER翻译成普通C我得到:
#include <stdio.h>
#include <stdlib.h>
void *fn(void *v)
{
int *i;
i = malloc(sizeof(int));
*i = (int)(long)v;
return i;
}
int main(void)
{
int *i = fn((void *)(long)10);
printf("%d\n", *i);
free(i);
return 0;
}
可携带吗?
为何选择演员long
?
在GTK中用于回调,例如:
#define FLAG 10
static void panel_set_handler(GtkWidget *widget, gpointer data)
{
panel_set(GPOINTER_TO_INT(data));
}
g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(panel_set_handler), GINT_TO_POINTER(FLAG));
答案 0 :(得分:2)
最简单的,只是来自intptr_t
。它是GLib宏的正确版本。
如果你有比intptr_t更大的东西,或者你对大小没有信心,你可以使用动态分配的内存指针,而不是这次演员:
void* ToHeap(void const *data, size_t dataSize)
{
void* ret = malloc(dataSize);
if(ret != NULL)
memcpy(ret, data, dataSize);
return ret;
}
int FromHeap(void* heapPtr, void *data, size_t dataSize)
{
int ret = 0;
if(heapPtr != NULL)
{
memcpy(data, heapPtr, dataSize);
free(heapPtr);
ret = 1;
}
return ret;
}
以下是与int
s:
void* IntToHeap(int i)
{
return ToHeap(&i, sizeof(int));
}
int IntFromHeap(void*heapPtr, int defaultValue)
{
int ret;
if(!FromHeap(heapPtr, &ret, sizeof(int))
ret = defaultValue;
return ret;
}
你可以这样使用:
#define FLAG 10
static void panel_set_handler(GtkWidget *widget, gpointer data)
{
panel_set(IntFromHeap(data, 0));
}
g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(panel_set_handler), IntToHeap(FLAG));
这种方式有点像你的帖子,减去所有这些演员。