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