Glib使用說明

Glib是一種底層庫,創建 GDK 和 GTK 應用程序時該庫可提供許多有用的定義和函數。它們包括基本類型及限制的定義、標準宏、類型轉換、字節序、存儲分配、警告和斷言、消息記錄、計時器、字符串 工具 (string utilities)、掛鉤 (hook) 函數、一個句法掃描器、動態加載模塊和自動字符串補全,它也定義了許多數據結構(及其相應的操作),包括存儲塊、雙向鏈表、單向鏈表、哈希表、串(動態增 長)、串塊(串的組)、數組(大小可隨元素的加入而增長)、平衡二叉樹、N 叉樹、夸克 (quark,一種字符串和其唯一的整數標識之間的雙向關聯)、鍵數據列表(可由字符串或整數標識訪問的數據元素列表)、關係和元組(可通過任一位置號索 引的數據表格)以及緩存 (cache)。

 
下面將總結Glib庫函數的一些功能,沒有包括所有函數,數據結構或操作。有關Glib庫的更完整的信息請看 Glib 文檔。你可以從 [url]http://www.gtk.org/[/url]下載得到。
 
1.定義
許多標準類型的極值定義是:
 
G_MINFLOAT
G_MAXFLOAT
G_MINDOUBLE
G_MAXDOUBLE
G_MINSHORT
G_MAXSHORT
G_MININT
G_MAXINT
G_MINLONG
G_MAXLONG
 
下面的 typedefs 也是定義。餘下未定義的則根據硬件平臺的不同而動態設置。請記住如果要想使程序具有可移植性就不要計算指針的大小。一個指針在 Alpha 上是 8 個字節,而在 Intel 80x86 系列 cpu 上是 4 個字節。
 
char   gchar;
short gshort;
long   glong;
int    gint;
char   gboolean;
 
unsigned char   guchar;
unsigned short gushort;
unsigned long   gulong;
unsigned int    guint;
 
float   gfloat;
double gdouble;
long double gldouble;
 
void* gpointer;
 
gint8
guint8
gint16
guint16
gint32
guint32
 
2.雙向鏈表
以下的函數用於創建、管理和銷燬標準雙向鏈表。鏈表中每個元素都包含一塊數據和指向前後元素的指針。這使得通過鏈表的雙向移動變的容易。數據項 的類型是"gpointer",意指數據可爲一指向實際數據的指針或 (通過類型轉換) 爲一數值(但不要設想 int 和 gpointer 有相同的大小!)。這些函數在內部按塊爲鏈表元素分配空間,這比單爲每個元素分配空間更有效率。
 
不存在專用於創建列表的函數。而是簡單地創建一個類型爲 Glist* 的變量,並把它的值設置爲 NULL;NULL被當作空表。
 
向鏈表中加入一個新元素,使用函數 g_list_append()、g_list_prepend()、g_list_insert() 或 g_list_insert_sorted() 。無論如何,函數都接收一個指向表頭的指針作爲參數,並返回一個指向表頭的指針(可能和接收的指針不同)。因此,對所有添加或撤除鏈表元素的操作,一定要 保存返回值!
 
GList *g_list_append( GList    *list, gpointer data );
 
此函數把一個新元素(具有值data)加到鏈表尾。
 
GList *g_list_prepend( GList    *list, gpointer data );
 
此函數把一個新元素(具有值data)加到鏈表頭。
 
GList *g_list_insert( GList    *list, gpointer data, gint position);
 
此函數插入一個新元素(具有值data)到鏈表中指定位置,如果位置是 0,它和g_list_prepend() 函數作用相同,如果位置,它和 g_list_append() 函數作用相同。
 
GList *g_list_remove( GList    *list, gpointer data);
 
此函數從表中移除一個具有值data的元素,如果該元素不存在,鏈表不變。
 
void g_list_free( GList *list );
 
此函數釋放由Glist使用的所有存儲區,如果表元素空間是通過動態分配的,則應
首先被釋放。
 
還有許多其它支持雙向鏈表的Glib函數;查看文檔獲得更多的信息。這兒列出幾個更有用的函數的聲明:
 
GList *g_list_remove_link( GList *list, GList *link );
 
GList *g_list_reverse( GList *list );
 
GList *g_list_nth( GList *list, gint n );
                          
GList *g_list_find( GList    *list, gpointer data );
 
GList *g_list_last( GList *list );
 
GList *g_list_first( GList *list );
 
gint g_list_length( GList *list );
 
void g_list_foreach( GList    *list, GFunc     func,  gpointer user_data );
 
 
3.單向鏈表
 
以上的許多函數用於單向鏈表是一樣的。下面是鏈表操作函數的部分列表:
 
GSList *g_slist_append( GSList   *list,
                        gpointer data );
               
GSList *g_slist_prepend( GSList   *list,
                         gpointer data );
                            
GSList *g_slist_insert( GSList   *list,
                        gpointer data,
                        gint      position );
                            
GSList *g_slist_remove( GSList   *list,
                        gpointer data );
                             
GSList *g_slist_remove_link( GSList *list,
                             GSList *link );
                            
GSList *g_slist_reverse( GSList *list );
 
GSList *g_slist_nth( GSList *list,
                     gint    n );
                             
GSList *g_slist_find( GSList   *list,
                      gpointer data );
                            
GSList *g_slist_last( GSList *list );
 
gint g_slist_length( GSList *list );
 
void g_slist_foreach( GSList   *list,
                      GFunc     func,
                      gpointer user_data );

4.存儲管理
gpointer g_malloc( gulong size );
 
這是 malloc() 函數的替代函數,不需要檢查返回值,因爲此函數已替你做這件事了。如果存儲分配因任何原因失敗,應用程序將被終止。
 
gpointer g_malloc0( gulong size );
 
和上一函數相同,但在返回指向所分配存儲塊的指針之前,將該存儲塊清 0。
 
gpointer g_realloc( gpointer mem,
                    gulong   size );
 
重新分配由mem開始,大小爲 size 字節的存儲塊。明顯地,該存儲塊先前已被分配。
 
void g_free( gpointer mem );
 
釋放分配的存儲塊。這很簡單。如果 mem 爲 NULL,則直接返回。
 
void g_mem_profile( void );
 
把用過的存儲塊的內容轉儲到一個文件中。但要這樣做,需要將#define MEM_PROFILE加到文件 glib/gmem.c 的開始處,然後重新運行命令 make 和make install。
 
void g_mem_check( gpointer mem );
 
檢查存儲位置的有效性。需要將#define MEM_CHECK加到文件 glib/gmem.c 的開始
處,然後重新運行命令 make 和 make install。
 
5.計時器
計時器函數可用於對操作計時(即查看操作所耗費的時間)。首先用 g_timer_new() 函數建立一個新計時器,然後用 g_timer_start() 函數啓動計時,用g_timer_stop() 停止計時,用 g_timer_elapsed() 函數決定所耗的時間。
 
GTimer *g_timer_new( void );
 
void g_timer_destroy( GTimer *timer );
 
void g_timer_start( GTimer *timer );
 
void g_timer_stop( GTimer *timer );
 
void g_timer_reset( GTimer *timer );
 
gdouble g_timer_elapsed( GTimer *timer,
                         gulong *microseconds );
 
 
 
6.字符串處理
GLib 定義了一個叫做 GString 的新類型,該類型相似於標準 C 中的string,但可以自動增長。字符串數據以null結尾。該類型可以防止程序中的緩衝區溢出錯誤。這是一個非常重要的特性,因此我推薦使用 GString。GString 有一簡單定義:
 
struct GString
{
 gchar *str; /* 指向當前以‘\0結尾的字符串。 */
 gint len; /* 當前長度 */
};
 
如你所預想的,有許多對一個 GString 型字符串的操作。
 
GString *g_string_new( gchar *init );
 
這個函數構造一個 GString 型字符串,它把 init指向的字符串值複製到 GString 型字符串中,返回一個指向它的指針。建一個初始爲空的 GString 型字符串則傳遞一個 NULL 作爲參數。
 
void g_string_free( GString *string,
                    gint     free_segment );
 
該函數釋放給定的 GString 型字符串的存儲空間。如果參數 free_segment 爲TRUE,也釋放其字符數據。
GString *g_string_assign( GString     *lval,
                          const gchar *rval );
 
該函數將 rval 中的字符複製到 lval 中,覆蓋 lval 中以前的內容。注意爲裝下複製的字符串,lval 會變長,這是和標準的 strcpy() 數不一樣的。
 
以下函數的功能是相當明顯的(帶有_c的版本接受一個字符而不是一個字符串):
 
GString *g_string_truncate( GString *string,
                            gint     len );
                            
GString *g_string_append( GString *string,
                          gchar   *val );
                           
GString *g_string_append_c( GString *string,
                            gchar    c );
       
GString *g_string_prepend( GString *string,
                           gchar   *val );
                            
GString *g_string_prepend_c( GString *string,
                             gchar    c );
       
void g_string_sprintf( GString *string,
                       gchar   *fmt,
                       ...);
       
void g_string_sprintfa ( GString *string,
                         gchar   *fmt,
                         ... );
7.實用程序和錯誤處理函數
gchar *g_strdup( const gchar *str );
 
替代strdup函數。把原字符串內容複製到新分配的存儲塊中,返回指向它的指針。
 
 
gchar *g_strerror( gint errnum );
 
我推薦使用此函數處理所有錯誤信息,它比 perror() 和其它類似函數更好,更具
可移植性。此函數的輸出通常爲如下格式:
 
program name:function that failed:file or further description:strerror
 
 
這裏有一個在我們的hello_world程序中調用此函數的示例:
 
g_print("hello_world:open:%s:%s\n", filename, g_strerror(errno));
void g_error( gchar *format, ... );
 
打印錯誤信息。格式同於 printf,但在錯誤信息前加上了"** ERROR **",並且退
出程序。僅用在致命錯誤上。
 
void g_warning( gchar *format, ... );
 
和前一函數功能相同,只是錯誤信息前是 " ** WARNING ** ",且不退出程序。
 
void g_message( gchar *format, ... );
 
在傳遞的字符串前打印 "message:"
 
void g_print( gchar *format, ... );
 
替代 printf() 函數。
 
本章最後一個函數:
 
gchar *g_strsignal( gint signum );
 
對所給信號的號碼打印出相應的信號名稱。在通用信號處理函數中有用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章