- 概览
- 涉及内容
- 布尔类型
- 整数相关
- 整数与指针相互转换
- 数字大小及截断
- 结构体相关
- 数组相关
- 系统相关
- 无返回函数的优化
为了使用的方便,GLib定了常用的一些宏,比如MIN、MAX等。
涉及内容 布尔类型TRUE、FALSE、NULL的含义不说自明。
#define FALSE (0) #define TRUE (!FALSE) #define NULL ((void *)0)整数相关 整数与指针相互转换
为了提高程序效率,在Glib、GTK等一些库中,为了函数中参数传递的数据常常为指针。特别地,对于32位整数类型,GLib提供4个宏,方便整数与指针的相互转换:
- 有符号整数:GINT_TO_POINTER(i)、GPOINTER_TO_INT( p )
- 无符号整数:GUINT_TO_POINTER(u)、GPOINTER_TO_UINT( p )
举个简单的例子如下:
#includeint main(int argc, char const *argv[]) { gpointer p; gint i = 10; p = GINT_TO_POINTER(i); gint j = GPOINTER_TO_INT(p); g_print("%dn", j); guint m = -10; p = GUINT_TO_POINTER(m); guint n = GPOINTER_TO_UINT(p); g_print("%dn", n); } // 输出 10 -10
至于为什么这样设计,读者可以自行查阅官方的文档,这里仅抛出如下几个问题:
- 为什么不使用 int *ip?
- 为什么仅仅支持32位整数?
- MAX、MIN、ABS分别表示取最大、最小与绝对值。
- CLAMP(x, low, high)是截断函数,用于限制x的值位于low与high之间。
- G_APPROX_VALUE(a, b, epsilon)用于判断a与b差的绝对值是否小于epsilon,即在误差epsilon下,a与b是否足够接近。
#define MAX(a, b) (((a) > (b)) ? (a) : (b)) #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define ABS(a) (((a) < 0) ? -(a) : (a)) #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) #define G_APPROX_VALUE(a, b, epsilon) (((a) > (b) ? (a) - (b) : (b) - (a)) < (epsilon))结构体相关
- G_SIZEOF_MEMBER(struct_type, member) 用于获取结构体struct_type中member的字节大小;
- G_STRUCT_OFFSET(struct_type, member) 用于获取结构体struct_type中member的偏移量大小;
- G_STRUCT_MEMBER(member_type, struct_p, struct_offset) 用于返回指向member_type类型的struct_p指针的偏移struct_offset字节的成员member;
- G_STRUCT_MEMBER_P(struct_p, struct_offset) 用于返回不确定类型的结构体struct_p指针的偏移struct_offset字节后的指针;
define G_N_ELEMENTS(arr) 用于返回数组中元素的个数,数组的大小必须要在编译时是确定的。
#define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0]))系统相关
G_OS_WIN32、G_OS_UNIX只会在WINDOW或LINUX有定义,可以用来区分当前操作系统。
与之相关的还有目录分隔符G_DIR_SEPARATOR、搜索路径分隔符G_SEARCHPATH_SEPARATOR,分别都是字符。此外,还有相应返回字符串的版本G_**_SEPARATOR_S。比如,在LINUX下,G_DIR_SEPARATOR是’/‘,G_SEARCHPATH_SEPARATOR是’:'。
补充说明:上述中的目录分割符,也就是一般意义上的路径的分隔符。而搜索路径分隔符指定的是多个路径之间的分隔符,这个在环境变量中十分常见,linux下为 :,Windows下为**;**。
无返回函数的优化针对与无返回函数,GNU C或MSVC在编译器中可能会有优化。G_NORETURN用来指明函数为无返回值,G_NORETURN_FUNCPTR用于指向无返回值的函数的指针。
# define G_NORETURN __attribute__ ((__noreturn__)) #define G_NORETURN_FUNCPTR // 示例 G_NORETURN void g_abort (void); G_NORETURN_FUNCPTR void (*funcptr) (void);



