在 GTK 2 中,数据类型主要基于 GLib(GTK 的基础库),提供了一套跨平台的数据类型和工具函数。以下是 GTK 2 中常用的数据类型及其说明:
基础数据类型
(1) 整数类型
| 类型 | 说明 | 对应 C 类型 | 示例 | 
| gint | 带符号整数 | int | gint x = 42; | 
| guint | 无符号整数 | unsigned int | guint y = 100; | 
| gint8, gint16, gint32, gint64 | 固定位宽整数 | int8_t, int16_t, … | gint32 val = 123456; | 
| guint8, guint16, guint32, guint64 | 无符号固定位宽整数 | uint8_t, uint16_t, … | guint16 port = 8080; | 
| glong | 长整数 | long | glong big = 1L << 32; | 
| gulong | 无符号长整数 | unsigned long | gulong flags = 0xFFFF; | 
(2) 浮点类型
| 类型 | 说明 | 对应 C 类型 | 示例 | 
| gfloat | 单精度浮点数 | float | gfloat pi = 3.14f; | 
| gdouble | 双精度浮点数 | double | gdouble e = 2.71828; | 
(3) 布尔类型
| 类型 | 说明 | 对应 C 类型 | 示例 | 
| gboolean | 布尔值 | int(TRUE/FALSE) | gboolean is_ok = TRUE; | 
(4) 字符和字符串
| 类型 | 说明 | 对应 C 类型 | 示例 | 
| gchar | 字符 | char | gchar c = ‘A’; | 
| guchar | 无符号字符 | unsigned char | guchar byte = 0xFF; | 
| gchar | 字符串(UTF-8) | char | gchar *str = “Hello”; | 
| gunichar | Unicode 字符 | uint32_t | gunichar uc = L’你’; | 
指针和内存管理
| 类型 | 说明 | 示例 | 
| gpointer | 通用指针(类似 void*) | gpointer data = malloc(100); | 
| gconstpointer | 只读通用指针 | gconstpointer const_data = “Immutable”; | 
| GObject | GTK 对象基类指针 | GObject obj = G_OBJECT(button); | 
内存管理函数:
gpointer g_malloc(gsize n_bytes);      
void     g_free(gpointer mem);         
gchar   g_strdup(const gchar str);   
容器和数据结构
(1) 动态数组(GArray)
GArray *array = g_array_new(FALSE, FALSE, sizeof(gint));
g_array_append_val(array, 42);  
gint val = g_array_index(array, gint, 0);  
g_array_free(array, TRUE);      
(2) 链表(GSList, GList)
GSList *list = NULL;
list = g_slist_append(list, "Item1");  
list = g_slist_remove(list, "Item1");  
g_slist_free(list);                    
(3) 哈希表(GHashTable)
GHashTable *hash = g_hash_table_new(g_str_hash, g_str_equal);
g_hash_table_insert(hash, "key", "value");  // 插入键值对
gchar *val = g_hash_table_lookup(hash, "key");  // 查找
g_hash_table_destroy(hash);                   // 释放内存
GTK 对象类型
| 类型 | 说明 | 示例 | 
| GtkWidget | 所有控件的基类 | GtkWidget button = gtk_button_new(); | 
| GtkWindow | 窗口对象 | GtkWindow win = GTK_WINDOW(top_level); | 
| GtkButton | 按钮控件 | GtkButton btn = GTK_BUTTON(button); | 
| GtkEntry | 输入框 | GtkEntry entry = GTK_ENTRY(text_input); | 
类型转换宏:
GtkButton *btn = GTK_BUTTON(widget);  
if (GTK_IS_BUTTON(widget)) { ... }    
信号和事件相关类型
| 类型 | 说明 | 示例 | 
| gulong | 信号连接ID | gulong handler_id = g_signal_connect(…); | 
| GCallback | 回调函数类型 | void callback(GtkWidget*, gpointer); | 
| GdkEvent | 事件结构体 | GdkEventButton event = (GdkEventButton*)ev; | 
信号连接示例:
g_signal_connect(button, "clicked", G_CALLBACK(on_click), NULL);