初识glib(1)
最近搞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 其它实用函数
g_get_prgname:获取程序的名字
g_set_prgname:设置程序的名字
g_get_user_name:返回当前用户的名字
g_get_real_name:获取用户的真实名称
g_get_home_dir:获取用户的根目录
g_get_current_dir:获取当前工作目录
g_basename:获得文件名(不带前导目录部分)
g_dirname:返回文件名的前导目录部分
g_atexit:指定一个在正常程序中止时要执行的函数
g_assert(condition):判断条件是否满足,不满足则输出一条警告信息后退出程序的执行
1.g_return_if_fail(condition):如果条件为假,则输出一条警告信息后从当前函数立刻返回
2.g_return_val_if_fail(condition,retval):如果条件为假,则输出一条警告信息后,从当前函数返回,返回值为retval
初识glib(1)的更多相关文章
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)
一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- UI篇(初识君面)
我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- 初识SpringMvc
初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...
- 初识redis数据类型
初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...
- Redis初识、设计思想与一些学习资源推荐
一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...
随机推荐
- python算法-快速排序
快速排序: 学习快速排序,要先复习下递归: 递归的2个条件: 1. 函数自己调用自己 2.有一个退出的条件 练习:基于递归下一个函数,计算n!并且求出当n等于10的值. n!=n * n-1*…..* ...
- Java 正则表达式详解---https://www.jb51.net/article/16829.htm
一.正则表达式基础知识 我们先从简单的开始.假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”.如果搜索对大小写不敏感,单词“catalog”.“Catherine”.“so ...
- x86保护模式 任务状态段和控制门
x86保护模式 任务状态段和控制门 每个任务都有一个任务状态段TSS 用于保存任务的有关信息 在任务内权变和任务切换时 需要用到这些信息 任务内权变的转移和任务切换 一 ...
- I/O输入系统
I/O输入系统 计算机有两个主要任务:I/O操作与计算处理.在许多情况下,主要任务是I/O操作.而计算处理只是附带的. 操作系统在计算机I/O方面的作用是管理和控制I/O操作和I/O设备. 概述 对与 ...
- Codeforces Round #407 (Div. 2) B+C!
B. Masha and geometric depression 被这个题坑了一下午,感觉很水,一直WA在第14组,我那个气啊,结束后发现第14组有点小争议,于是找出题人解释,然后出题人甩给了我一段 ...
- tomact和eclipse的关联
tomact和eclipse的关联有很多文档,这里说下下面的问题: 问题: tomact安装成功,点击startup.sh能正常访问,通过eclipse启动后,不能打开8080页面 解决: l 重 ...
- P1026 统计单词个数 (动态规划)
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- Codevs 2989 寻找somebody
时间限制: 2 s 空间限制: 8000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个n*m的方阵中 寻找somebody的位置 有可能k不存在输出“bianta ...
- Scott Mitchell的ASP.NET2.0数据指南中文版索引
原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] 原文http://www.cnblogs.com/ilovejolly/archive/2006/10/05/52 ...
- [转发]Android 系统稳定性 - ANR(三)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任. 很久之前写的了,留着有点浪费,共享之. 编写者:李文栋 http://rayleeya.iteye.com/blog/1956056 1. ...