1 glibc 是gnu发布的libc库,也即c运行库。

2 glib是gtk+的一套函数库,gobject是glib的精粹,glib是用C实现的.glib提供了动态数组、单/双向链表、哈希表、多叉树、平衡二叉树、字符串等常用容器,完全是面向对象设计的,实现得非常精致。不用白不用,别客气了。

3 类型定义:
整数类型:gint8,guint8,gint16,guint16,gint32,guint32,gint64,guint64
整数类型:gshort,glong,gint和short,long,int等价
布尔类型:gboolean:TRUE FALSE
字符型:gfloat,gdouble与float、double等价
指针:gpointer相当于标准C的void *
     gconstpointer相当于const void *

4 glib宏
TRUE 1
FALSE 0
NULL ((void*)0)
MIN() MAX()返回最大或最小的数
ABS()返回绝对值
CLAMP(x,low,high)若x在[low,high]返回内,则等于x,如果x小于low,则返回low;如果x大于high,则返回high
gint my_int;
gpointer my_pointer;
my_int = 5;
my_pointer = GINT_TO_POINTER(my_int);
printf("We are storing %d\n", GPOINTER_TO_INT(my_pointer));

5 宏调试

前提条件检查:
  #include <glib.h>
  g_return_if_fail(condition)
  g_return_val_if_fail(condition, retval)
  这个宏列表列出了 g l i b的预条件检查宏。对g_return_if_fail,如果条件为假,则打印一个警告信息并且从当前函数立刻返回。g_return_val_if_fail与前一个宏类似,但是允许返回一个值。毫无疑问,这些宏很有用 — 如果大量使用它们,特别是结合 G t k +的实时类型检查,会节省大量的查找指针和类型错误的时间。

断言:
#include <glib.h>
g_assert(condition)
g_assert_not_reached()

 如果断言失败,将返回一条信息,通常应该在包含断言的模块中查找错误;如果 g_return_if_fail()检查失败,通常要在调用这个模块的代码中查找错误。这也是断言与前提条件检查的区别。

6 内存管理
a g_malloc()总是返回gpointer,而不是char*,所以不必转换返回值。
b 如果低层的 malloc()失败,g_malloc()将退出程序,所以不必检查返回值是否是 NULL。
c g_malloc() 对于分配0字节返回NULL。
d g_free()忽略任何传递给它的 NULL指针。

7 字符串操作
#include <glib.h>
gint g_snprintf(gchar* buf,
              gulong n,
              const gchar* format,
              ...)
gint g_strcasecmp(const gchar* s1,
              const gchar* s2)
gint g_strncasecmp(const gchar* s1,
              const gchar* s2,
              guint n)
g_strdup(),g_strndup()返回一个已分配内存的字符串或字符串前 n个字符的拷贝。

8 数据结构
a 链表 GSList GList
GSList* list = NULL;
gchar* element = g_strdup("a string");
list = g_slist_append(list, element);

为了遍历整个链表,可以如下操作:
GSList* tmp = list;
while (tmp != NULL)
  {
    printf("List data: %p\n", tmp->data);
    tmp = g_slist_next(tmp);
  }

  这意味着用 g _ s l i s t _ a p p e n d ( )构造一个链表是一个很糟糕的主意。当需要一个特殊顺序的
列表项时,可以先调用 g_slist_prepend()前插数据,然后调用 g_slist_reverse()将链表颠倒过来。

b 树
GTree是基本的平衡二叉树,它将存储按键值排序成对键值; GNode存储任意的树结构数据,比如分析树或分类树。

函数列表: 创建和销毁平衡二叉树
#include <glib.h>
GTree* g_tree_new(GCompareFunc key_compare_func)
void g_tree_destroy(GTree* tree)

9 GString
 除了使用 gchar *进行字符串处理以外, Glib还定义了一种新的数据类型: GString。它类似于标准 C的字符串类型,但是 GString能够自动增长。它的字符串数据是以 NULL结尾的。

10 计时器函数
使用它的第一步是用g_timer_new ( )函数创建一个计时器,然后使用 g_timer_start( )函数开始对操作计时,使用g_timer_stop()函数停止对操作计时,用 g_timer_elapsed()函数判定计时器的运行时间。    
例子:
#include <glib.h>
#include <locale.h>
GMainLoop* loop;
gint counter = 10;
gboolean callback(gpointer arg)
{
    g_print("hello world\n");
    g_message("中文");
    fflush();
    if(--counter ==0){
        g_print("\n");
        //退出循环
        g_main_loop_quit(loop);
        //注销定时器
        return FALSE;
    }
    //定时器继续运行
    return TRUE;
}
int main(int argc, char* argv[])
{
    setlocale (LC_ALL, "");/*将程序的locale设置成与console的一致*/
    //g_thread_init是必需的,GMainLoop需要gthread库的支持。
    if(g_thread_supported() == 0)
        g_thread_init(NULL);
    //创建一个循环体,先不管参数的意思。
    g_print("g_main_loop_new\n");
    loop = g_main_loop_new(NULL, FALSE);
   //增加一个定时器,100毫秒运行一次callback
    g_timeout_add(1000,callback,NULL);
    g_print("g_main_loop_run\n");
    g_main_loop_run(loop);
    g_print("g_main_loop_unref\n");
    g_main_loop_unref(loop);
    return 0;
}

双向链表

01     GList *g_list_append(GList *list, gpointer data):将一个新元素加入到链表尾
02     GList *g_list_prepend(GList *list, gpointer data):将一个新元素加入到链表头
03     GList *g_list_insert(GList *list, gpointer data, gint position):插入一个新元素到链表的指定位置
04     GList *g_list_remove(GList *list, gpointer data):从链表中移除一个具有值data的元素,如果元素不存在,则链表不变
05     GList *g_list_free(GList *list):数释放由GList使用的所有存储区
06     GList *g_list_remove_link(GList *list, GList *link)
07     GList *g_list_reverse(GList *list):链表元素位置反转
08     GList *g_list_nth(GList *list, gint n):获取指定位置元素
09     GList *g_list_find(GList *list, gpointer data):在链表中查找一个含有指定值的元素,没有则返回NULL
10     GList *g_list_last(GList *list):获取链表中最后一个元素
11     GList *g_list_first(GList *list):获取链表中第一个元素
12     gint g_list_length(GList *list):返回链表元素个数
13     void g_list_foreach(GList *list, GFunc func, gpointer data):遍历链表
14     gint g_list_index(GList *list, gconstpointer data):返回指定元素在链表中的位置,没有找到匹配的元素,则返回-1。元素位置从0开始计算。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐