将 gpointer 转换为 GType 的正确方法

Correct way to cast a gpointer to a GType

我正在尝试创建一个宏,它将 gpointer 转换为 GType,反之亦然。我使用相关的 API documentation 作为指南创建了以下宏来执行此操作:

#ifdef GTYPE_TO_POINTER
  #define GTYPE_TO_POINTER (x) (GSIZE_TO_POINTER (x))
#endif
#ifdef GPOINTER_TO_GTYPE
  #define GPOINTER_TO_GTYPE(p) (GPOINTER_TO_SIZE (p))
#endif

我按如下方式完成了转换:

type = (GType)g_hash_table_lookup(typeTable, GUINT_TO_POINTER(tflag));

我想做如下转换:

type = GPOINTER_TO_GTYPE(g_hash_table_lookup(typeTable, GUINT_TO_POINTER(tflag)));

 // stuff

 g_hash_table_insert(typeTable,
                     GUINT_TO_POINTER(tflag),
                     GTYPE_TO_POINTER(type)); 

但是,这似乎有问题,因为我的编译器指示已使用 g_hash_table_lookup 强制转换和以下 g_hash_table_insert

的第三个参数进行了隐式声明
warning: implicit declaration of function 'GPOINTER_TO_GTYPE'          
warning: implicit declaration of function 'GTYPE_TO_POINTER'
warning: passing argument 3 of 'g_hash_table_insert' makes pointer from integer without a cast [-Wint-conversion]

另外,当我尝试 运行 包装器时,我得到 java: symbol lookup errorundefined symbol: GPOINTER_TO_GTYPE

任何人都可以建议我可以做些什么来解决这个问题吗?

好吧,我现在好像自己弄明白了....

首先,我在检查 GTYPE_TO_POINTERGPOINTER_TO_GTYPE 时使用了错误的测试,因为它们是我想要定义的变量,编译器找不到它们并且从未进行过定义。

其次,我使用未定义的变量作为参数,因此这些宏的正确定义似乎是:

#ifdef GPOINTER_TO_SIZE
  #define GPOINTER_TO_GTYPE(gpointer) (GPOINTER_TO_SIZE (gpointer))
#endif
#ifdef GSIZE_TO_POINTER
  #define GTYPE_TO_POINTER(gtype) (GSIZE_TO_POINTER(gtype))
#endif

这意味着我的转换函数现在可以毫无问题地编译。