glib

glib

glib庫是Linux平台下最常用的C語言函數庫,它具有很好的可移植性和實用性。

glib是Gtk+庫和Gnome的基礎。glib可以在多個平台下使用,比如Linux、Unix、Windows等。glib為許多標準的、常用的C語言結構提供了相應的替代物。如果在程序中要使用到glib庫中的函數,則應該包含glib.h頭文件(在gtk.h和gnome.h頭文件中已經包含了glib.h了)

類型定義


整數類型:gint8、guint8、gint16、guint16、gint32、guint32、gint64、guint64。不是所有的平台都提供64位整型
整數類型gshort、glong、gint和short、long、int相同
布爾類型gboolean:gboolean可以取兩個值:TRUE和FALSE
字元型gchar和char相同
浮點型gfloat和gdouble和float、double完全等價
指針gpointer對應於標準C的void*
gconstpointer對於於標準C的const void*


常用宏

整型與指針類型間的轉換
GINT_TO_POINTER(a):將int型轉換成gpointer類型
GPOINTER_TO_INT(a):將gpointer類型轉換成int型
GUINT_TO_POINTER(a):將uint類型轉換成gpointer類型
GPOINTER_TO_UINT(a):將gpointer類型轉換成整型
NULL宏的定義:#define NULL(void*)0(也就是說:0是一個整型數據,而NULL則是指針類型)

調試宏

前提條件檢查(當定義了G_DISABLE_CHECKS時,前提條件檢查宏在編譯時就會消失)
斷言(當定義了G_DISABLE_ASSERT后,斷言宏在編譯時就會消失,而不會加入生成的程序中)
所有調試宏使用g_log輸出警告信息,g_log的警告信息包括發生錯誤的應用程序或庫函數的名字。

指定的構件

“GTK_IS_構件名”系列宏用來判斷構件是否是相應的構件
GTK_IS_BUTTON:用來判斷構件是否是按鈕
GTK_IS_NOTEBOOK:用來判斷構件是否是筆記本構件

常用函數


g_warning:在控制台輸出一條警告信息
g_error:在控制台輸出一條錯誤信息后結束程序的執行
g_print:在控制台輸出一條信息
g_object_unref(gpointer object):用來對object的引用數減1。當對object的引用數降為0時,刪除object
g_file_test:判斷某個文件是否存在
g_spawn_sync:創建一個子進程來運行外部程序。當子進程結束后,該函數才返回(同步的執行一個子進程)

內存管理


g_malloc總是返回gpointer類型。如果申請失敗,g_malloc將退出程序,所以不用檢查返回值
g_free忽略任何傳遞給它的NULL指針
g_realloc函數和realloc函數功能相同
g_malloc0:將分配的內存的每一個單元都置0
字元串處理

字元串操作

g_snprintf:用來格式化一個字元串,比sprintf函數安全
g_strcasecmp:實現兩個字元串大小寫不敏感的比較
g_strncasecmp:實現兩個字元串的前n個字元大小寫不敏感的比較

修改字元串

g_strdown將字元串轉換成小寫字母
g_strup將字元串轉換成大寫字母
g_strreverse將字元串顛倒過來
g_strchug刪除字元串前的空格
g_strchomp刪除字元串尾的空格

字元串轉換

g_strtod:把字元串轉換成gdouble類型
g_strerror:將出錯代碼轉換成描述出錯代碼的字元串
g_strsignal:將信號值轉換成描述信號的字元串

轉換函數

g_strdup和g_strndup返回一個已分配內存的字元串或字元串前n個字元的拷貝
g_strconcat用來連接兩個字元串
g_strsplit在每個分隔符處分隔分割字元串,並返回一個新分配的字元串

數據結構


鏈表

glib提供了普通的單向鏈表和雙向鏈表,分別是GSList和GList。鏈表中的數據域是一個gpointer類型(通過GINT_TO_POINTER轉換也可以使得鏈表中可以保存整型)。
g_list_pervious用在雙向鏈表中來查找指定元素的前一個元素,該函數為雙向鏈表中獨有的函數。
註:這裡只講單向鏈表函數,其它雙向鏈表函數只需要將單向鏈表函數名改為“g_list_名稱”即可,也適用。
g_slist_append用來在單向鏈表中添加一個元素
g_slist_remove用來在單向鏈表中刪除一個元素
g_slist_next用來獲取指定元素的下一個元素
g_slist_prepend用來在鏈表表頭插入數據
g_slist_reverse用來將鏈表中的元素反置
g_slist_insert用來在指定位置插入一個元素
g_slist_remove用來在刪除指定的元素
g_slist_foreach對鏈表的每一項調用GFunc函數。GFunc函數的定義如下:void* GFunc(gpointer data,gpointer user_data)

在glib中有兩種不同的樹:GTree是基本的平衡二叉樹,它將存儲的數據按其值排序成二叉排序樹

GString


GString類似於標準C的字元串類型,但是GString能夠自動增長,這些特性可以防止程序中的緩衝區溢出。下面是GString的定義:
struct GString{
gchar* str;指向字元串數據的存儲空間
gint len;字元串的長度
}
g_string_new(gchar* init):使用一個字元串來創建一個GString結構
g_string_free(GString* string,gint free_segment):釋放GString所佔的內存
g_string_assign(GString* lval,const gchar* rval):將字元串rval複製到lval,銷毀lval原有的內容
g_string_truncate:截取字元串來生成指定長度的字元串
g_string_append:將字元串追加到指定字元串後面
g_string_append_c:將字元追加到指定的字元串後面
g_string_prepend:將字元串追加到指定的字元串前面
g_string_prepend_c:將字元追加到指定的字元串前面
g_string_sprintf:將一個格式化字元串寫入到GString中

計時器函數


計數器函數可以用於為操作計時。使用過程如下:
使用g_timer_new創建一個計時器
使用g_timer_start來開始對操作計時
使用g_timer_stop來停止計時
使用g_timer_elapsed來判斷計時器運行的時間
不用時,使用g_timer_destroy來銷毀一個計時器
在使用過程中,還可以使用g_timer_reset來將計時器重新置零

錯誤處理函數


g_strerror使用錯誤代碼來獲取一個描述錯誤的字元串。輸出結果一般採用:“程序名:發生錯誤的函數名:文件或者描述”
g_error列印一條出錯信息,然後退出程序。其格式與printf相似,但在它的信息前面加上了“**ERROR**”
g_warning列印一條警告信息,與printf相似,但在它的信息前面加上“**WARNING**”,而且它不退出程序。通常用於不是太嚴重的錯誤
g_message在輸出的字元串前面加上了“**message**”,用來輸出一條信息
g_strsignal通過信號值獲取描述該信號的字元串

其它實用函數


g_get_prgname:獲取程序的名字
g_set_prgname:設置程序的名字
g_get_user_name:返回當前用戶的名字
g_get_real_name:獲取用戶的真實名稱
g_get_home_dir:獲取用戶的根目錄
g_get_current_dir:獲取當前工作目錄
g_basename:獲得文件名(不帶前導目錄部分)
g_dirname:返迴文件名的前導目錄部分
g_atexit:指定一個在正常程序中止時要執行的函數