`

Glib学习笔记(1)

 
阅读更多

GLib学习笔记

Glib笔记1

以前主要是做C++,最近有个机会转到嵌入式的C,大部分用的是Glib/Gobject系统,前一周的样子把相关内容大致浏览了一遍,主要以reference Menu为主。我看英文书的一个习惯是看一章,总结一章,这样学得快,记得牢。以前整理过很多书籍,不过都是本地的doc文档。在学Glib过程中,从网上学到很多知识,所以我也放到博客上吧。仅供自己总结,风格比较随意。

这一部分主要是Glib的基础

1.1 版本信息

注意,自己的程序里边都要包含<glib.h>

下面这些宏:用于版本信息,主要用于configure时候的版本检测,一般应用程序不太用这个

#define GLIB_MAJOR_VERSION

#define GLIB_MINOR_VERSION
#define
GLIB_MICRO_VERSION
#define
GLIB_CHECK_VERSION (major,minor,micro)
最后一个宏,返回布尔值,应用程序可用他判断是否为正确的版本。

[这一小节没什么东西]

1.2 基本数据类型

Glib提供了一套可移植的原始数据类型,例如gint等,知道这个就行了,以后写Glib的程序,尽量用它定义的数据类型

有几个值得注意:

l gboolean:返回TRUEFALSE

l 代表返回void*指针的--gpointer,以及一个const void* gconstpointer

l 返回可表示范围的,例如G_MINSHORT,G_MAXSHORT

l 提供给printscan函数的宏,如G_GINT16_MODIFIER/G_GINT16_FORMAT

l 64位整数,有两个红,G_GINT64_CONSTANT,G_GUINT64_CONSTANT

l sizeof(struct)返回gsize类型,goffsset=gint64

[没什么难度这一节]

1.3 基本数据类型的表示范围

上一节也提到过,例如G_MAXINT,G_MININT

1.4 标准宏

#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset)

member_type:成员类型

strutc_p:指向该结构的指针

struct_offset:偏移

估计里边的实现是 (member_type*((gchar*)struct_p + struct_offset)

类似的还有:

#define G_STRUCT_MEMBER_P(struct_p, struct_offset)

没有前面的强制类型转换了

#define G_STRUCT_OFFSET(struct_type, member)

返回member在结构中的偏移字节。具体怎么实现有点忘记了,但是内核代码中常见这样的内容。

1.5 类型转换宏

#define GINT_TO_POINTER (i)

#define GPOINTER_TO_INT (p)

#define GUINT_TO_POINTER (u)

#define GPOINTER_TO_UINT (p)

#define GSIZE_TO_POINTER (s)

#define GPOINTER_TO_SIZE (p)

目的其实很简单,就是在指针类型中存储整数类型。我们倒是经常在Windows下用DWORD存储指针类型的数据。

1.6 字节序宏

转换字节序的一些辅助宏和函数,例如g_htons,g_ntohs等。

l 本机是怎样的字节序?查看宏定义G_BYTE_ORDER

没什么意思

1.7 数值定义

定义一些数值常量。

G_PI,定义Pi常量。

没什么意思

1.8 其他杂项

l 定义一个多行的宏,G_STMT_STARTG_STMT_END,其实就是do/while{0}的组合

l G_BEGIN_DECLS,G_END_DECLS,头文件中用的开头和结尾

有些有用,到时候再查就知道了。

1.9 原子操作函数

很多啊

gint g_atomic_int_get ();

void g_atomic_int_set ();

void g_atomic_int_add ();

gint g_atomic_int_exchange_and_add ();

gboolean g_atomic_int_compare_and_exchange ();

gpointer g_atomic_pointer_get ();

void g_atomic_pointer_set ();

gboolean g_atomic_pointer_compare_and_exchange

();

void g_atomic_int_inc (gint *atomic);

gboolean g_atomic_int_dec_and_test (gint *atomic);

manual做的也真是不到位,竟然连参数都没有写进来。

看这些东西,最好装一个source insight。直接看源码。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics