栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

GLib基础——标准宏

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

GLib基础——标准宏

目录
  • 概览
  • 涉及内容
    • 布尔类型
    • 整数相关
      • 整数与指针相互转换
      • 数字大小及截断
    • 结构体相关
    • 数组相关
    • 系统相关
    • 无返回函数的优化

概览

为了使用的方便,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 )

举个简单的例子如下:

#include 

int 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

至于为什么这样设计,读者可以自行查阅官方的文档,这里仅抛出如下几个问题:

  1. 为什么不使用 int *ip?
  2. 为什么仅仅支持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);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030860.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号