【c&c++】glib介紹

opensmarty發表於2024-10-10

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

glib是Gtk +庫和Gnome的基礎。glib可以在多個平臺下使用,比如Linux、Unix、Windows等。glib為許多標準的、常用的C語言結構提供了相應的替代物。

如果在程式中要使用到glib庫中的函式,則應該包含glib.h標頭檔案(在gtk.h和gnome.h標頭檔案中已經包含了glib.h了)

1 型別定義

1. 整數型別:gint8、guint8、gint16、guint16、gint31、guint32、gint64、guint64。不是所有的平臺都提供64位整型

2. 整數型別gshort、glong、gint和short、long、int相同

3. 布林型別gboolean:gboolean可以取兩個值:TRUE和FALSE

4. 字元型gchar和char相同

5. 浮點型gfloat和gdouble和float、double完全等價

6. 指標gpointer對應於標準C的void*

7. gconstpointer對於於標準C的const void*


2 glib宏

2.1 常用宏

整型與指標型別間的轉換

1. GINT_TO_POINTER(a):將int型轉換成gpointer型別

2. GPOINTER_TO_INT(a):將gpointer型別轉換成int型

3. GUINT_TO_POINTER(a):將uint型別轉換成gpointer型別

4. GPOINTER_TO_UINT(a):將gpointer型別轉換成整型

5. NULL宏的定義:#define NULL (void*)0(也就是說:0是一個整型資料,而NULL則是指標型別)

2.2 除錯宏

前提條件檢查(當定義了G_DISABLE_CHECKS時,前提條件檢查宏在編譯時就會消失)

斷言(當定義了G_DISABLE_ASSERT後,斷言宏在編譯時就會消失,而不會加入生成的程式中)

所有除錯宏使用g_log輸出警告資訊,g_log的警告資訊包括髮生錯誤的應用程式或庫函式的名字。

2.3 判斷構建是否是指定的構件

  1. “ GTK_IS_構件名”系列宏用來判斷構件是否是相應的構件
  2. GTK_IS_BUTTON:用來判斷構件是否是按鈕

    GTK_IS_NOTEBOOK:用來判斷構件是否是筆記本構件


3 常用函式

1. g_warning:在控制檯輸出一條警告資訊

2. g_error:在控制檯輸出一條錯誤資訊後結束程式的執行

3. g_print:在控制檯輸出一條資訊

4. g_object_unref(gpointer object):用來對object的引用數減1。當對object的引用數降為0時,刪除object

5. g_file_test:判斷某個檔案是否存在

6. g_spawn_sync:建立一個子程序來執行外部程式。當子程序結束後,該函式才返回(同步的執行一個子程序)


4 記憶體管理

1. g_malloc總是返回gpointer型別。如果申請失敗,g_malloc將退出程式,所以不用檢查返回值

2. g_free忽略任何傳遞給它的NULL指標

3. g_realloc函式和realloc函式功能相同

4. g_malloc0:將分配的記憶體的每一個單元都置0


4 字串處理

4.1 字串操作

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

4.2 修改字串

1. g_strdown將字串轉換成小寫字母

2. g_strup將字串轉換成大寫字母

3. g_strreverse將字串顛倒過來

4. g_strchug刪除字串前的空格

5. g_strchomp刪除字串尾的空格

4.3 字串轉換

1. g_strtod:把字串轉換成gdouble型別

2. g_strerror:將出錯程式碼轉換成描述出錯程式碼的字串

3. g_strsignal:將訊號值轉換成描述訊號的字串

4.4 其他字串轉換函式

1. g_strdup和g_strndup返回一個已分配記憶體的字串或字串前n個字元的複製

2. g_strconcat用來連線兩個字串

3. g_strsplit在每個分隔符處分隔分割字串,並返回一個新分配的字串


5 資料結構

5.1 連結串列

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)

5.2 樹

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

5.3 雜湊表


6 GString

GString類似於標準C的字串型別,但是GString能夠自動增長,這些特性可以防止程式中的緩衝區溢位。下面是GString的定義:

struct GString{

gchar* str; 指向字串資料的儲存空間

gint len; 字串的長度

}

1. g_string_new(gchar* init):使用一個字串來建立一個GString結構

2. g_string_free(GString* string,gint free_segment):釋放GString所佔的記憶體

3. g_string_assign(GString* lval,const gchar* rval):將字串rval複製到lval,銷燬lval原有的內容

4. g_string_truncate:擷取字串來生成指定長度的字串

5. g_string_append:將字串追加到指定字串後面

6. g_string_append_c:將字元追加到指定的字串後面

7. g_string_prepend:將字串追加到指定的字串前面

8. g_string_prepend_c:將字元追加到指定的字串前面

9. g_string_sprintf:將一個格式化字串寫入到GString中


7.計時器函式

計數器函式可以用於為操作計時。使用過程如下:

1. 使用g_timer_new建立一個計時器

2. 使用g_timer_start來開始對操作計時

3. 使用g_timer_stop來停止計時

4. 使用g_timer_elapsed來判斷計時器執行的時間

5. 不用時,使用g_timer_destroy來銷燬一個計時器

6. 在使用過程中,還可以使用g_timer_reset來將計時器重新置零


8 錯誤處理函式

1. g_strerror使用錯誤程式碼來獲取一個描述錯誤的字串。輸出結果一般採用:“程式名:發生錯誤的函式名:檔案或者描述”

2. g_error列印一條出錯資訊,然後退出程式。其格式與printf相似,但在它的資訊前面加上了“**ERROR**”

3. g_warning列印一條警告資訊,與printf相似,但在它的資訊前面加上“**WARNING**”,而且它不退出程式。通常用於不是太嚴重的錯誤

4. g_message在輸出的字串前面加上了“**message**”,用來輸出一條資訊

5. g_strsignal透過訊號值獲取描述該訊號的字串


9 其它實用函式

  1. g_get_prgname:獲取程式的名字
  2. g_set_prgname:設定程式的名字
  3. g_get_user_name:返回當前使用者的名字
  4. g_get_real_name:獲取使用者的真實名稱
  5. g_get_home_dir:獲取使用者的根目錄
  6. g_get_current_dir:獲取當前工作目錄
  7. g_basename:獲得檔名(不帶前導目錄部分)
  8. g_dirname:返回檔名的前導目錄部分
  9. g_atexit:指定一個在正常程式中止時要執行的函式

g_assert(condition):判斷條件是否滿足,不滿足則輸出一條警告資訊後退出程式的執行

1.g_return_if_fail(condition):如果條件為假,則輸出一條警告資訊後從當前函式立刻返回

2.g_return_val_if_fail(condition,retval):如果條件為假,則輸出一條警告資訊後,從當前函式返回,返回值為retval

【參考連結】

libc
glib介紹
glibc g_strsplit 切割字串
定義一個迴圈的 loop 宏方法