Previous Next Contents

17. glib

glib提供许多有用的函数及定义. 我把它们列在这里并做简短的解释. 很多都是与libc重复, 对这些我不再详述. 这些大致上是用来参考, 您知道有什麽东西可以用就好.

17.1 定义

为保持资料型态的一致, 这里有一些定义:

G_MINFLOAT
G_MAXFLOAT
G_MINDOUBLE
G_MAXDOUBLE
G_MINSHORT
G_MAXSHORT
G_MININT
G_MAXINT
G_MINLONG
G_MAXLONG

此外, 以下的typedefs. 没有列出来的是会变的, 要看是在那一种平台上. 如果您想要具有可移植性, 记得避免去使用sizeof(pointer). 例如, 一个指标在Alpha上是8 bytes, 但在Inter上为4 bytes.

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

17.2 双向链结串列

以下函数用来产生, 管理及销毁双向链结串列.

GList* g_list_alloc       (void);

void   g_list_free        (GList     *list);

void   g_list_free_1      (GList     *list);

GList* g_list_append      (GList     *list,
                           gpointer   data);
                           
GList* g_list_prepend     (GList     *list,
                           gpointer   data);
                        
GList* g_list_insert      (GList     *list,
                           gpointer   data,
                           gint       position);

GList* g_list_remove      (GList     *list,
                           gpointer   data);
                           
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);

17.3 单向链结串列

以下函数是用来管理单向链结串列:

GSList* g_slist_alloc       (void);

void    g_slist_free        (GSList   *list);

void    g_slist_free_1      (GSList   *list);

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

17.4 记忆体管理

gpointer g_malloc      (gulong    size);

这是替代malloc()用的. 你不需要去检查返回值, 因为它已经帮你做好了, 保证.

gpointer g_malloc0     (gulong    size);

一样, 不过会在返回之前将记忆体归零.

gpointer g_realloc     (gpointer  mem,
                        gulong    size);

重定记忆体大小.

void     g_free        (gpointer  mem);
void     g_mem_profile (void);

将记忆体的使用状况写到一个档案, 不过您必须要在glib/gmem.c里面, 加#define MEM_PROFILE, 然後重新编译.

void     g_mem_check   (gpointer  mem);

检查记忆体位置是否有效. 您必须要在glib/gmem.c上加#define MEM_CHECK, 然後重新编译.

17.5 Timers

Timer函数..

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

17.6 字串处理

GString* g_string_new       (gchar   *init);
void     g_string_free      (GString *string,
                             gint     free_segment);
                             
GString* g_string_assign    (GString *lval,
                             gchar   *rval);
                             
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,
                             ...);

17.7 工具及除错函数

gchar* g_strdup    (const gchar *str);

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

列印Unix系统的信号名称, 在信号处理时很有用.

这些大都从glib.h中而来.


Previous Next Contents