Glib2中G_DEFINE_TYPE原理(四)

一、Glib2源码定义G_DEFINE_TYPE实现

1.Glib2源码G_DEFINE_TYPE定义
#define G_DEFINE_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
#define G_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_)      _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
 
#define _G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \
\
static void     type_name##_init              (TypeName        *self); \
static void     type_name##_class_init        (TypeName##Class *klass); \
static gpointer type_name##_parent_class = NULL; \
static void     type_name##_class_intern_init (gpointer klass) \
{ \
  type_name##_parent_class = g_type_class_peek_parent (klass); \
  type_name##_class_init ((TypeName##Class*) klass); \
} \
\
gulong\
type_name##_get_type (void) \
{ \
  static volatile gsize g_define_type_id__volatile = 0; \
  if (g_once_init_enter (&g_define_type_id__volatile))  \
    { \
      gulongg_define_type_id = \
        g_type_register_static_simple (TYPE_PARENT, \
                                       g_intern_static_string (#TypeName), \
                                       sizeof (TypeName##Class), \
                                       (GClassInitFunc) type_name##_class_intern_init, \
                                       sizeof (TypeName), \
                                   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`G_DEFINE_TYPE_WITH_PRIVATE()` 宏用于定义包含私有数据成员的 GObject 类型,它的语法如下: ```c G_DEFINE_TYPE_WITH_PRIVATE (TypeName, type_name, parent_type) ``` 其,`TypeName` 表示你要定义的 GObject 类型的名称,`type_name` 表示定义的类型名称的小写形式,`parent_type` 表示该类型的父类型。 使用该宏后,会自动定义一个 `TypeNamePrivate` 结构体来存储私有数据成员,并且会自动生成访问这些私有数据成员的 get/set 函数。这些函数的命名格式为: ```c TypeName_get_my_private_data() TypeName_set_my_private_data() ``` 下面是一个使用 `G_DEFINE_TYPE_WITH_PRIVATE()` 宏定义 `MyObject` 类型的示例代码: ```c #include <glib-object.h> typedef struct _MyObjectPrivate MyObjectPrivate; struct _MyObjectPrivate { int my_private_data; }; G_DEFINE_TYPE_WITH_PRIVATE (MyObject, my_object, G_TYPE_OBJECT) static void my_object_init (MyObject *self) { MyObjectPrivate *priv; priv = my_object_get_instance_private (self); priv->my_private_data = 0; } static void my_object_class_init (MyObjectClass *klass) { /* Add class initialization code here */ } int main (int argc, char **argv) { MyObject *obj = g_object_new (MY_TYPE_OBJECT, NULL); return 0; } ``` 在该示例代码,我们定义了一个名为 `MyObject` 的 GObject 类型,并在其包含了一个名为 `my_private_data` 的私有数据成员。在 `my_object_init()` 函数,我们通过 `my_object_get_instance_private()` 函数来获取私有数据成员的指针,并对其进行初始化。在 `my_object_class_init()` 函数,我们可以添加一些类初始化的代码。最后,在 `main()` 函数,我们使用 `g_object_new()` 函数来创建一个 `MyObject` 对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android系统攻城狮

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值