glib简介
1 glibc 是gnu发布的libc库,也即c运行库。2 glib是gtk+的一套函数库,gobject是glib的精粹,glib是用C实现的.glib提供了动态数组、单/双向链表、哈希表、多叉树、平衡二叉树、字符串等常用容器,完全是面向对象设计的,实现得非常精致。不用白不用,别客气了。3 类型定义:整数类型:gint8,guint8,gint16,guint16,gint32,gui...
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开始计算。
更多推荐
所有评论(0)