原文地址:http://forum.ubuntu.org.cn/viewtopic.php?f=70&t=361163
gnome是基于gtk+开发的一套桌面环境,gnome和KDE作为两大最流行的桌面环境,在全世界广泛使用。只要是在Linux下工作的开发人员,对于gtk+一定不陌生。 而对于glib,这个gtk+下的无名英雄,其功能强大却鲜为人知 。今天,在这里简要介绍一下,如果你是开发人员,看完本文,相信你会爱上它的。
glib不是gllibc ,尽管两者都是基于(L)GPL的开源软件。但这一字之差却误之千里,glibc是GNU实现的一套标准C的库函数,而glib是gtk+的一套函数库。在linux平台上,像其它任何软件一样,glib依赖于glibc。
glib不是一个学院派的东西,也不是凭空想出来的,完全是在开发gtk+的过程中,慢慢总结和完善的结果。如果你是一个工作3年以上的C语言程序员,现在让你讲讲写程序的苦恼,你可能有很多话要说,但如果你有时间研究一下glib,你会发现,很多苦恼已不再成其为苦恼,glib里很多东西正是你期望已经久的。
gobject是glib的精粹 ,glib是用C实现的,但在很大程序是基于面向对象思想设计的,gobject是所有类的基类。signal在其中也是一大特色,signal与操作系统中的signal并不一样,它是类似消息一样的东西,让消息在各个对象间传递,但尽量降低对象间的耦合。仔细读一下它的代码,唯一想说的话就是“绝!”。
动态数组、链表、哈希表等通用容器,在不同的公司,在不同的时期,在不同的情况下,我们每个人对每一种容器,可能都实现过N次以上。甚至在同一个项目里,出现几份链表的实现,也并非罕见。一直在抱怨,标准C中为什么没有类似于STL的标准容器,让全世界的程序员在数以万次的重复实现它们。不过,还算走运,有了glib,恶梦在此终结了。 glib提供了动态数组、单/双向链表、哈希表、多叉树、平衡二叉树、字符串等常用容器 ,完全是面向对象设计的,实现得非常精致。不用白不用,别客气了。
你开发过跨硬件平台的软件吗?是不是常常为硬件平台的差异而苦恼呢?字节顺序是常见的问题之一,大端格式,小端格式,还是PDP格式的?这样差异造成的BUG会浪费不少时间,同时让代码晦涩难读。glib提供了一套完整的宏,利用这些宏编写程序,问题大大简化了。
你开发过跨操作系统的软件吗?在不同的平台下,很多函数有相同的功能,但函数原型,返回值差异巨大,也有的貌合神离,相同的名称有着不同的意义,请看下面这张清单:
为完成相同的功能,你却要为此写出不同的代码。那怕只是一个简单的封装,这么多,你烦不烦?用glib吧,它的作者们都是高手中的高手,对不同的平台的理解程度,远远超出你和我,而且这些程序经过大量的应用程序测试,已经非常的稳定了,放心的用吧。
你写过读取配置文件的模块吧,像读取ini这样简单格式的文件,当然不在话下,要读markup语言格式的配置文件,难度可能大了点,虽然不是不可能,但除非是为了学习,何必自己找麻烦呢。glib里提供了词法分析、markup语言解析、ini文件存取等功能,你完全不用为此担忧。
不管是命令行程序,还是GUI程序,或者后台服务进程,通过命令参数来控制程序的行为,都是开发人员惯用的手法。从命令行参数取到有用的信息,不难,遍历一遍不就行了吗?但在每个程序中都来遍一次,你不觉得很单调吗?我们的时间很宝贵,浪费时间做这种事情,不值得吧。glib的作者们早考虑到了,它提供了这样的功能,你调用的它的函数,可能轻松的取得所要的命令行参数。
对于正则表达式,Win32下的开发人员可能用得少一点,而在Linux下的Shell里,它却是不可或缺之物。有没有想到在自己的程序中使用的它呢,在有的情况下,使用正则表达式,可能会大大降低开发的难度,提高易用性。glib也想到了这一点,它提供了简单的正则表达式功能,当然,用与不用完全取决于你自己。
在程序里,如果程序出错了,特别是调了不该调用的函数,你是不是很想知道是谁调了它?大多数时候用debuger是最好的选择,在某些情况下,没有debuger可用,或者在debuger里重现不了这个问题,你会不会觉得很无助?别怕,glib提供了一套跨平台的backtrace函数,有了它,你可以很容易找到元凶了。
如果读过一些大型的开源项目,你会发现,差不多每个项目都有一套自己的log函数,用于记录程序运行的调试或者审计信息。也有可能,你自己都曾在不同的项目里实现过好几次这个功能,第一次实现会觉得很好玩,会学到了一些东西,后来就会发现自己在做无用功。重复就是浪费,重复就是犯罪,glib想到了这一点,它实现了一套完整的log机制,供大家在不同的项目中使用。
产生质数的算法不难,在我们的程序里也像是星外来客,很少使用,常常忽略了它。所谓书到用时方恨少,有这样的东东,说不定就有用得到它的时候。glib提供了这样的功能,同时还提供了一个较好的随机数算法。
Linux Shell里的自动补完功能很好用吧,从Linux转移到Win32下工作的开发人员,常常抱怨Win32的Shell里没有这个功能,其实Win32下也是有的,把注册表里的一个选项打开就行了。不管怎么样,总之这个功能太有用了,没有它,你都会觉得少了点什么,全身不自在,glib里连这个功能都提供了,是不是很人性化呢?
内存问题!还是内存问题!如果你没有为内存问题而苦恼过,我都怀疑你是不是一个真正的C语言程序员。内存泄露、访问越界、空指针、野指针和内存优化等问题,是不是都曾让你夜不能昧?有些工具可以帮助你,但这不是万能的良药,好好写你的程序才是第一要义。glib提供了一些的手段,也可以在一定程度上减轻你的痛苦
目录
================================================
================================================
gnome是基于gtk+开发的一套桌面环境,gnome和KDE作为两大最流行的桌面环境,在全世界广泛使用。只要是在Linux下工作的开发人员,对于gtk+一定不陌生。 而对于glib,这个gtk+下的无名英雄,其功能强大却鲜为人知 。今天,在这里简要介绍一下,如果你是开发人员,看完本文,相信你会爱上它的。
glib不是gllibc ,尽管两者都是基于(L)GPL的开源软件。但这一字之差却误之千里,glibc是GNU实现的一套标准C的库函数,而glib是gtk+的一套函数库。在linux平台上,像其它任何软件一样,glib依赖于glibc。
glib不是一个学院派的东西,也不是凭空想出来的,完全是在开发gtk+的过程中,慢慢总结和完善的结果。如果你是一个工作3年以上的C语言程序员,现在让你讲讲写程序的苦恼,你可能有很多话要说,但如果你有时间研究一下glib,你会发现,很多苦恼已不再成其为苦恼,glib里很多东西正是你期望已经久的。
gobject是glib的精粹 ,glib是用C实现的,但在很大程序是基于面向对象思想设计的,gobject是所有类的基类。signal在其中也是一大特色,signal与操作系统中的signal并不一样,它是类似消息一样的东西,让消息在各个对象间传递,但尽量降低对象间的耦合。仔细读一下它的代码,唯一想说的话就是“绝!”。
动态数组、链表、哈希表等通用容器,在不同的公司,在不同的时期,在不同的情况下,我们每个人对每一种容器,可能都实现过N次以上。甚至在同一个项目里,出现几份链表的实现,也并非罕见。一直在抱怨,标准C中为什么没有类似于STL的标准容器,让全世界的程序员在数以万次的重复实现它们。不过,还算走运,有了glib,恶梦在此终结了。 glib提供了动态数组、单/双向链表、哈希表、多叉树、平衡二叉树、字符串等常用容器 ,完全是面向对象设计的,实现得非常精致。不用白不用,别客气了。
你开发过跨硬件平台的软件吗?是不是常常为硬件平台的差异而苦恼呢?字节顺序是常见的问题之一,大端格式,小端格式,还是PDP格式的?这样差异造成的BUG会浪费不少时间,同时让代码晦涩难读。glib提供了一套完整的宏,利用这些宏编写程序,问题大大简化了。
你开发过跨操作系统的软件吗?在不同的平台下,很多函数有相同的功能,但函数原型,返回值差异巨大,也有的貌合神离,相同的名称有着不同的意义,请看下面这张清单:
- 动态库加载函数
- 线程函数
- 信号量函数
- 互斥锁函数
- 事件函数
- 字符集转换函数
- 原子操作函数
- 创建进程函数
- 时间格式
- IO函数
为完成相同的功能,你却要为此写出不同的代码。那怕只是一个简单的封装,这么多,你烦不烦?用glib吧,它的作者们都是高手中的高手,对不同的平台的理解程度,远远超出你和我,而且这些程序经过大量的应用程序测试,已经非常的稳定了,放心的用吧。
你写过读取配置文件的模块吧,像读取ini这样简单格式的文件,当然不在话下,要读markup语言格式的配置文件,难度可能大了点,虽然不是不可能,但除非是为了学习,何必自己找麻烦呢。glib里提供了词法分析、markup语言解析、ini文件存取等功能,你完全不用为此担忧。
不管是命令行程序,还是GUI程序,或者后台服务进程,通过命令参数来控制程序的行为,都是开发人员惯用的手法。从命令行参数取到有用的信息,不难,遍历一遍不就行了吗?但在每个程序中都来遍一次,你不觉得很单调吗?我们的时间很宝贵,浪费时间做这种事情,不值得吧。glib的作者们早考虑到了,它提供了这样的功能,你调用的它的函数,可能轻松的取得所要的命令行参数。
对于正则表达式,Win32下的开发人员可能用得少一点,而在Linux下的Shell里,它却是不可或缺之物。有没有想到在自己的程序中使用的它呢,在有的情况下,使用正则表达式,可能会大大降低开发的难度,提高易用性。glib也想到了这一点,它提供了简单的正则表达式功能,当然,用与不用完全取决于你自己。
在程序里,如果程序出错了,特别是调了不该调用的函数,你是不是很想知道是谁调了它?大多数时候用debuger是最好的选择,在某些情况下,没有debuger可用,或者在debuger里重现不了这个问题,你会不会觉得很无助?别怕,glib提供了一套跨平台的backtrace函数,有了它,你可以很容易找到元凶了。
如果读过一些大型的开源项目,你会发现,差不多每个项目都有一套自己的log函数,用于记录程序运行的调试或者审计信息。也有可能,你自己都曾在不同的项目里实现过好几次这个功能,第一次实现会觉得很好玩,会学到了一些东西,后来就会发现自己在做无用功。重复就是浪费,重复就是犯罪,glib想到了这一点,它实现了一套完整的log机制,供大家在不同的项目中使用。
产生质数的算法不难,在我们的程序里也像是星外来客,很少使用,常常忽略了它。所谓书到用时方恨少,有这样的东东,说不定就有用得到它的时候。glib提供了这样的功能,同时还提供了一个较好的随机数算法。
Linux Shell里的自动补完功能很好用吧,从Linux转移到Win32下工作的开发人员,常常抱怨Win32的Shell里没有这个功能,其实Win32下也是有的,把注册表里的一个选项打开就行了。不管怎么样,总之这个功能太有用了,没有它,你都会觉得少了点什么,全身不自在,glib里连这个功能都提供了,是不是很人性化呢?
内存问题!还是内存问题!如果你没有为内存问题而苦恼过,我都怀疑你是不是一个真正的C语言程序员。内存泄露、访问越界、空指针、野指针和内存优化等问题,是不是都曾让你夜不能昧?有些工具可以帮助你,但这不是万能的良药,好好写你的程序才是第一要义。glib提供了一些的手段,也可以在一定程度上减轻你的痛苦
目录
================================================
- 组织数据 …………………… 2楼
- GLib 的范畴
- 每个程序都必须管理数据
- 内置的数据结构
- 100 字以内(或者更少)的算法分析
- 编译 GLib 程序
- 使用 pkg-config
- GLib 的现实应用
- 单向链表 …………………… 3楼
- 概念
- 创建、添加和销毁
- 添加然后删除数据
- 删除重复的条目
- 最后一个、第 n 个 和第 n 个数据
- 退一步:使用用户定义的类型
- 组合、反转,等等
- 简单遍历
- 使用函数进行高级遍历
- 使用 GCompareFunc 排序
- 查找元素
- 通过插入进行高级添加
- 自定义数据结构排序 (根据字符)
- 自定义数据结构排序(根据数字)
- 实际应用
- 双向链表 …………………… 4楼
- 概念
- 基本操作
- 更好的导航
- 使用链接删除节点
- 索引和位置
- 实际应用
- 散列表 …………………… 5楼
- 概念
- 一些简单的散列表操作
- 插入和替换值
- 遍历 键/值 对
- 查找条目
- 难处理的情形:从表中删除
- 高级查找:找到键和值
- 每个键多个值
- 现实应用
- 数组 …………………… 6楼
- 概念
- 基本操作
- 更多 new/free 选项
- 添加数据的更多方法
- 插入数据
- 删除数据
- 排序
- 指针数组
- 字节数组
- 实际应用
- 树 …………………… 7楼
- 概念
- 树的基本操作
- 替换和提取
- 查找数据
- 使用 foreach 列出树
- 搜索
- 不只是二叉:n-叉 树
- 实际应用
- 队列 …………………… 8楼
- 概念
- 基本操作
- 删除和插入条目
- 查找条目
- 使用队列:拷贝、反转和遍历每一个(foreach)
- 使用链接的更多乐趣
- 排序
- 实际应用
- 关系 …………………… 9楼
- 概念
- 基本操作
- 选择元组
- 总结 …………………… 10楼
- 结束语
- 致谢
- 参考资料 …………………… 11楼
- 学习
- 获得产品和技术
- 讨论
- 关于作者 …………………… 12楼
================================================