初识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 其它实用函数

  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

时间: 2024-08-30 12:46:41

初识glib(1)的相关文章

初识Python,望君多多关照

在学习Python之前,我们接触过数据结构和网页制作.前者让我们学习如何把C语言运用的更加整齐规范,而后者让我们亲身学习如何运用所学,制作一个静态网页.通过这些课程的学习,让我对C语言产生了比较大的压力,以至于对编程.对这学期的Python课程都有一种如临大敌的感觉. 但是真的学习了这门课程,体会了编码过程中的一些固定运用方法和套路之后,也许过程中对这门课程隐隐约约产生了一点点朦胧的感觉,仿佛他也并没有想象中的那么困难,起码现在的学习让我认为,他可能没有C语言那么繁琐和麻烦.当然,以一个初学者的

初识数组排序!!!!

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>初识数组排序</title> <!--调试成功--> <style type="text/css"> *{ padding:0; margin: 0; } li,ul{ list-style: none; } #p

初识操作系统和linux

初识操作系统和linux 1.计算机系统由硬件系统和软件系统两大部分组成:是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动.高速地处理,然后把处理结果输出的现代化智能电子设备. 2.世界上第一台计算机是1946年诞生在美国宾州大学. 3.冯·诺依曼体系结构:1946年数学家冯·诺依曼于提出计算机硬件系统由运算器.控制器.存储器.输入设备.输出设备.摩根定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍.现在计算机技术进本很难遵

JAVA 初识类加载机制 第13节

JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行.这些过程都是我们看不见的,我们能看见的也就是一个.class文件.既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些.class文件呢?虚拟机获得这些.class文件的过程就是类加载了. 所以,总结来说就是:虚拟机将.class文件从磁盘或者其他地

初识React

原文地址:北云软件-初识React 专注于UI 在MVC分层设计模式中,react常被拿来实现视图层(V).React不依赖于技术栈的其他部分,因此可以方便的在现有项目中尝试用它来实现一个小特性. 虚拟DOM React从DOM中抽象出来,给出一种更简洁的编程模型,且性能表现更好.能够通过NodeJS实现服务端渲染,通过React Native开发原生app. 数据流React实现单向.响应式数据流,减少boilerplate且比传统数据绑定更容易理解. 简洁的组件React的组件都实现了一个r

malloc和free的内存到底有多大?——GNU glib库

大家应该都比较熟悉这一点:malloc分配的内存一定大于用户指定的大小!而且很多人也问过这样的问题:到底大多少?以及实际上malloc到底分配了多少? 我们知道这个大小一定在某个"神奇"地方记录着,但是就像自己的"思维"一样,你确无法感知!不过,这是错觉,只是我们习惯了只使用,而没有深入剖析源码,在这里我将揭开这个面纱,去掉其透明化! 声明:源码基于GNU glib库的2.7版本的malloc目录下相关文件 再声明:不同的C库实现方式不一定一样,这里是glib库,如

泛型的几种类型以及初识webform

今天学习的可以分为两类吧,但是学习的都是比较抽象的,不太容易掌握吧.首先我们大部分时间学习了泛型,泛型的委托,泛型接口以及枚举器,迭代器,扩展方法:最后简单的认识了webform,实现了一个简单的功能. 一.泛型 定义:泛型(generic)可以软糖多个类型共享一组代码,泛型允许我们声明类型参数化.可以用不同的类型进行实例化,说白了,就是可以用类型占位符,创建具体类型致命的真实概念.C#中提供了五种泛型,类,结构,接口,委托和方法.下面举例说明可能更容易理解, class MyStack<T>

最新计算机技术与管理科学应用专家——初识ERB

ERB管理系统:英文全称Enterprise Resource and Behavior,英文简称:ERB,中文名全称:企业资源与行为管理系统.ERB是由理文企业管理顾问有限公司首席管理师,现任商翼ERB企业管理系统项目总监吴志华先生,于2010年9月首先提出的.ERB不再单以供应链管理作为系统应用的基础,而是以企业行为与企业资源规划的最佳结合作为系统应用设计的核心基础,强调企业行为的规划.执行.监督与追溯,强调企业管理水平与员工素养的持续提升:提供企业行为与企业资源管理最佳结合的整体应用解决方

[OpenGL]环境搭建以及OpenGL初识

想往游戏行业发展的话,经常被提及到的就是OpenGL和DirectX,这两者听起来感觉是一门挺高深的技术,今天我也开始摸索学习OpenGL,那么OpenGL到底是什么?它和DirectX有什么区别和联系? OpenGL初识 OpenGL只是一套图形函数库 DirectX包含图形.声音.输入.网络等模块. 但就图形而论,DirectX的图形库性能不如OpenGL,OpenGL稳定,可以跨平台使用,DirectX只支持Windows平台,所以OpenGL还是有它的优势!OpenGL ES是OpenG