这里给出 GLib 包括的基本内容快速浏览,了解详细内容请去官网查阅相关资料。
获取版本号
const gchar* glib_check_version()
基本数据类型
GLib 重新定义了基本数据类型,这样方便在不同平台上移植。其中我最欣赏的是对 char 的处理,我觉得 C++ 里面添加 w_char 处理 Unicode 字符问题,有些多此一局了。GLib 把 gchar 定义为 char,意味着要采用 utf8 表达 unicode 字符串。其实最近比较引人注目的 rust 编程语言也是直接用 uft8 处理通用字符串问题。
GLib 常用数据类型
C 语言数据类型 | GLib 数据类型 |
char | gchar |
short | gshort |
long | glong |
int | gint |
char | gboolean |
void* | gpointer |
标准宏
函数
#define | G_IS_DIR_SEPARATOR() |
#define | MIN() |
#define | MAX() |
#define | ABS() |
#define | CLAMP() |
#define | G_STRUCT_MEMBER() |
#define | G_STRUCT_MEMBER_P() |
#define | G_STRUCT_OFFSET() |
#define | G_N_ELEMENTS() |
类型和数值
#define | G_OS_WIN32 |
#define | G_OS_UNIX |
#define | G_DIR_SEPARATOR |
#define | G_DIR_SEPARATOR_S |
#define | G_SEARCHPATH_SEPARATOR |
#define | G_SEARCHPATH_SEPARATOR_S |
#define | TRUE |
#define | FALSE |
#define | NULL |
#define | G_MEM_ALIGN |
#define | G_CONST_RETURN |
类型转换宏
#define | GINT_TO_POINTER() |
#define | GPOINTER_TO_INT() |
#define | GUINT_TO_POINTER() |
#define | GPOINTER_TO_UINT() |
#define | GSIZE_TO_POINTER() |
#define | GPOINTER_TO_SIZE() |
字节顺序宏
字节顺序宏-一种可移植的方式来转换不同的字节顺序。
这些宏提供了一种确定主机字节顺序和在不同字节顺序之间转换值的可移植方法。
字节顺序是存储字节以创建较大数据类型(如gint和glong值)的顺序。主机字节顺序是当前计算机上使用的字节顺序。
一些处理器首先存储最重要的字节(即保存值的最大部分的字节)。这些被称为大端处理器。其他处理器(特别是x86系列)最后存储最重要的字节。这些被称为小端处理器。
最后,更复杂的是,其他一些处理器以一种非常奇怪的顺序存储字节,称为PDP endian。对于4字节字,先存储第三个最高有效字节,然后存储第四个,然后存储第一个,最后存储第二个。
显然,当这些不同的处理器彼此通信时,例如通过网络或通过使用二进制文件格式进行通信时,会出现问题。这就是这些宏出现的地方。它们通常用于将值转换为字节顺序,以便在不同处理器之间通信时使用。互联网使用所谓的“网络字节顺序”作为标准字节顺序(实际上是大端字节顺序)。
请注意,字节顺序转换宏可能会多次计算其参数,因此不应将它们与具有副作用的参数一起使用。
边界检查整数算法
边界检查整数算法-一组用于执行检查整数算法的帮助程序。
GLib提供了一组宏来执行无符号整数的加法和乘法,并检查溢出。
助手们都有三个论点。指向目标的指针始终是第一个参数,操作的操作数是另外两个。
按照标准GLib约定,如果成功,helpers返回TRUE(即:无溢出)。
辅助对象可以是宏、普通函数或内联线。在可用的情况下,可以使用内联汇编或编译器内部函数来实现它们。
数值定义
数值定义.数学常数和浮点分解。
GLib提供了一些数学常数,比如GƏPI作为PI的值;许多平台的C库中都有这些,但有些平台没有,GLib版本总是存在的。
GFloatIEEE754 和 GDoubleIEEE754 并集用于访问 IEEE 浮点和双精度浮点的符号、尾数和指数。这些联合定义为适用于给定平台。至少 Intel、PPC 和 Sparc 支持 IEEE 浮点和双倍(用于存储)。有关 IEEE 数字格式的更多信息,请参阅 IEEE 754-2008。
杂项宏
杂项宏-不经常使用的专用宏。
这些宏提供了应用程序程序员不经常需要的更专业的特性。
原子操作
原子操作.基本原子整数和指针操作。
下面是编译器宏的集合,用于提供对整数和指针大小的值的原子访问。
名称中包含“int”的宏将在指向 gint 和 guint 的指针上操作。名称中带有 “pointer” 的宏将操作指向任何指针大小的值的指针,包括 gsize。在具有 32 位指针的平台上不支持 64 位操作,因为通常不可能以原子方式执行这些操作。
整数和指针的 get、set 和 exchange 操作通常分别在 gint 和 gpointer上操作。在算术运算中,“add”运算操作(并返回)有符号整数值(gint和gssize),“and”、“or”和“xor”运算操作(并返回)无符号整数值(guint和gssize)。
所有的操作都充当一个完整的编译器和(在适当的情况下)硬件内存屏障。获取和发布或生产者和消费者屏障语义不可通过此API使用。
非常重要的是,对特定整数或指针的所有访问只能使用此API执行,并且不同大小的操作不能混合使用或在重叠的内存区域上使用。永远不要直接从值中读取或赋值——始终使用此API。
出于简单的引用计数目的,应该使用 g_atomic_int_inc()
和 g_atomic_int_dec_and_test()
。不属于简单引用计数模式的其他用法容易出现细微的错误,有时还会出现未定义的行为。另外值得注意的是,由于所有这些操作都需要整个机器的全局同步,因此它们可能会非常慢。在执行多个原子操作的情况下,通常可以更快地在关键区域周围获取互斥锁,正常执行操作,然后释放锁。