最近搞DLNA,发现download的源码有许多glib库的使用。于是在Ubuntu中安装了glib库,以及简单测试了一些glib库函数,以此增加对glib的了解。

概述:glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性. glib是Gtk +库和Gnome的基础。glib可以在多个平台下使用,比如Linux、Unix、Windows等。glib为许多标准的、常用的C语言结构提供了相应的替代物。(以来自百度百科)

如果在程序中要使用到glib库中的函数,则应该包含glib.h头文件(在gtk.h和gnome.h头文件中已经包含了glib.h了)

1 类型定义

1. 整数类型:gint8、guint8、gint16、guint16、gint31、guint32、gint64、guint64。不是所有的平台都提供64位整型

2. 整数类型gshort、glong、gint和short、long、int相同

3. 布尔类型gboolean:gboolean可以取两个值:TRUE和FALSE

4. 字符型gchar和char相同

5. 浮点型gfloat和gdouble和float、double完全等价

6. 指针gpointer对应于标准C的void*

7. gconstpointer对于于标准C的const void*

2 glib宏

2.1 常用宏

整型与指针类型间的转换

1. GINT_TO_POINTER(a):将int型转换成gpointer类型

2. GPOINTER_TO_INT(a):将gpointer类型转换成int型

3. GUINT_TO_POINTER(a):将uint类型转换成gpointer类型

4. GPOINTER_TO_UINT(a):将gpointer类型转换成整型

5. NULL宏的定义:#define NULL (void*)0(也就是说:0是一个整型数据,而NULL则是指针类型)

2.2 调试宏

前提条件检查(当定义了G_DISABLE_CHECKS时,前提条件检查宏在编译时就会消失)

断言(当定义了G_DISABLE_ASSERT后,断言宏在编译时就会消失,而不会加入生成的程序中)

所有调试宏使用g_log输出警告信息,g_log的警告信息包括发生错误的应用程序或库函数的名字。

2.3 判断构建是否是指定的

1.“ GTK_IS_构件名”系列宏用来判断构件是否是相应的构

2. GTK_IS_BUTTON:用来判断构件是否是按钮

3. GTK_IS_NOTEBOOK:用来判断构件是否是笔记本构件

3 常用函数

1. g_warning:在控制台输出一条警告信息

2. g_error:在控制台输出一条错误信息后结束程序的执行

3. g_print:在控制台输出一条信息

4. g_object_unref(gpointer object):用来对object的引用数减1。当对object的引用数降为0时,删除object

5. g_file_test:判断某个文件是否存在

6. g_spawn_sync:创建一个子进程来运行外部程序。当子进程结束后,该函数才返回(同步的执行一个子进程)

4 内存管理

1. g_malloc总是返回gpointer类型。如果申请失败,g_malloc将退出程序,所以不用检查返回值

2. g_free忽略任何传递给它的NULL指针

3. g_realloc函数和realloc函数功能相同

4. g_malloc0:将分配的内存的每一个单元都置0

4.4 其他字符串转换函数

1. g_strdup和g_strndup返回一个已分配内存的字符串或字符串前n个字符的拷贝

2. g_strconcat用来连接两个字符串

3. g_strsplit在每个分隔符处分隔分割字符串,并返回一个新分配的字符串

5 数据结构

5.1 链表

glib提供了普通的单向链表和双向链表,分别是GSList和GList。链表中的数据域是一个gpointer类型(通过GINT_TO_POINTER转换也可以使得链表中可以保存整型)。

  • g_list_pervious用在双向链表中来查找指定元素的前一个元素,该函数为双向链表中独有的函数。

  • 注:这里只讲单向链表函数,其它双向链表函数只需要将单向链表函数名改为“g_list_名称”即可,也适用。

  • g_slist_append用来在单向链表中添加一个元素

  • g_slist_remove用来在单向链表中删除一个元素

  • g_slist_next用来获取指定元素的下一个元素

  • g_slist_prepend用来在链表表头插入数据

  • g_slist_reverse用来将链表中的元素反置

  • g_slist_insert用来在指定位置插入一个元素

  • g_slist_remove用来在删除指定的元素

  • g_slist_foreach对链表的每一项调用GFunc函数。GFunc函数的定义如下:void* GFunc(gpointer data,gpointer user_data)

5.2 树

在glib中有两种不同的树:GTree是基本的平衡二叉树,它将存储的数据按其值排序成二叉排序树

5.3 哈希表

6 GString

GString类似于标准C的字符串类型,但是GString能够自动增长,这些特性可以防止程序中的缓冲区溢出。下面是GString的定义:

struct GString{

gchar* str; 指向字符串数据的存储空间

gint len; 字符串的长度

}

1. g_string_new(gchar* init):使用一个字符串来创建一个GString结构

2. g_string_free(GString* string,gint free_segment):释放GString所占的内存

3. g_string_assign(GString* lval,const gchar* rval):将字符串rval复制到lval,销毁lval原有的内容

4. g_string_truncate:截取字符串来生成指定长度的字符串

5. g_string_append:将字符串追加到指定字符串后面

6. g_string_append_c:将字符追加到指定的字符串后面

7. g_string_prepend:将字符串追加到指定的字符串前面

8. g_string_prepend_c:将字符追加到指定的字符串前面

9. g_string_sprintf:将一个格式化字符串写入到GString中

7.计时器函数

计数器函数可以用于为操作计时。使用过程如下:

1. 使用g_timer_new创建一个计时器

2. 使用g_timer_start来开始对操作计时

3. 使用g_timer_stop来停止计时

4. 使用g_timer_elapsed来判断计时器运行的时间

5. 不用时,使用g_timer_destroy来销毁一个计时器

6. 在使用过程中,还可以使用g_timer_reset来将计时器重新置零

8 错误处理函数

1. g_strerror使用错误代码来获取一个描述错误的字符串。输出结果一般采用:“程序名:发生错误的函数名:文件或者描述”

2. g_error打印一条出错信息,然后退出程序。其格式与printf相似,但在它的信息前面加上了“**ERROR**”

3. g_warning打印一条警告信息,与printf相似,但在它的信息前面加上“**WARNING**”,而且它不退出程序。通常用于不是太严重的错误

4. g_message在输出的字符串前面加上了“**message**”,用来输出一条信息

5. g_strsignal通过信号值获取描述该信号的字符串

9 其它实用函数

  1. g_get_prgname:获取程序的名字

  2. g_set_prgname:设置程序的名字

  3. g_get_user_name:返回当前用户的名字

  4. g_get_real_name:获取用户的真实名称

  5. g_get_home_dir:获取用户的根目录

  6. g_get_current_dir:获取当前工作目录

  7. g_basename:获得文件名(不带前导目录部分)

  8. g_dirname:返回文件名的前导目录部分

  9. g_atexit:指定一个在正常程序中止时要执行的函数

g_assert(condition):判断条件是否满足,不满足则输出一条警告信息后退出程序的执行

1.g_return_if_fail(condition):如果条件为假,则输出一条警告信息后从当前函数立刻返回

2.g_return_val_if_fail(condition,retval):如果条件为假,则输出一条警告信息后,从当前函数返回,返回值为retval

初识glib(1)的更多相关文章

  1. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  2. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  3. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  4. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

  5. UI篇(初识君面)

    我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...

  6. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  7. 初识SpringMvc

    初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...

  8. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

  9. Redis初识、设计思想与一些学习资源推荐

    一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...

随机推荐

  1. hlgoj 1766 Cubing

    模拟.下图是我做的小模型. #include <iostream> #include <stdio.h> #include <queue> #include < ...

  2. 【UML】9种图+包图

    导读:在UML的学习中,介绍了9种图,外加一个包图.这9种图和4大关系,可以说是UML的一个核心内容.我根据自己的笔记,以及查阅的一些资料,对这9种图和包图,做一个总结. 一.基本定义 1.1  总体 ...

  3. Understanding performance, load and stress testing

    What are performance, load and stress testing? Performance testing, load testing and stress testing ...

  4. BZOJ 2820 YY的GCD ——莫比乌斯反演

    我们可以枚举每一个质数,那么答案就是 $\sum_{p}\sum_{d<=n}\mu(d)*\lfloor n / pd \rfloor *\lfloor m / pd \rfloor$ 直接做 ...

  5. Web Services 教程

    Web Services 可使您的应用程序成为 Web 应用程序. Web Services 通过 Web 进行发布.查找和使用. Web Services 是应用程序组件 Web Services  ...

  6. hdu 2100

    #include<stdio.h> #include<string.h> char a[300],b[300]; int a1[300],b1[300]; int main() ...

  7. 程序自动分析(codevs 4600)

    题目描述 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi ...

  8. 标准C程序设计七---16

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  9. C++ assert 的一点说明

    断言(ASSERT)的用法 转载自http://www.cnblogs.com/moondark/archive/2012/03/12/2392315.html 我一直以为assert仅仅是个报错函数 ...

  10. Python使用eval强制转换字符串为字典时报错:File "<string>", line 1, in <module> NameError: name 'nan' is not defined

    文本中保存的内容为: { 'QQQ': [0.067, 0.167, 0.2, 0.033, 0.233, 0.267, 0.1, 0.133], 'TTT': [0.5, 0.375, 0.25, ...