2015-05-31 2 views
0

Я пытаюсь создать макрос, который будет отличать gpointer до GType и наоборот. Я создал следующие макросы, чтобы сделать это, используя соответствующий API documentation в качестве руководства:Правильный способ бросить gpointer на GType

#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 error из в undefined symbol: GPOINTER_TO_GTYPE.

Может ли кто-нибудь посоветовать, что я могу сделать, чтобы исправить это?

ответ

0

Хорошо, я, кажется, понял это сам в настоящее время ....

Во-первых, я использовал неправильный тест в проверке GTYPE_TO_POINTER и GPOINTER_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 

Что значит мои функции литья компилировать без проблем.

Смежные вопросы