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 *进行字符串处理以外, G l i b还定义了一种新的数据类型: G S t r i n g。它类似于标准 C的字符串类型,但是 GString能够自动增长。它的字符串数据是以 NULL结尾的。
10 计时器函数
使用它的第一步是用g _ t i m e r _ n e w ( )函数创建一个计时器,然后使用 g _ t i m e r _ s t a r t ( )函数开始对操作计时,使用g_timer_stop()函数停止对操作计时,用 g_timer_elapsed()函数判定计时器的运行时间。