功能宏

GObjectADD_PRIVATE

版本要求:2.38

声明 [src]

#define G_ADD_PRIVATE (
  TypeName
)

描述 [src]

一种便利宏,用于轻松将私有数据添加到 G_DEFINE_TYPE_WITH_CODE() 或 G_DEFINE_ABSTRACT_TYPE_WITH_CODE() 的 _C_ 部分中新类型实例。

比如

  typedef struct _MyObject MyObject;
  typedef struct _MyObjectClass MyObjectClass;

  typedef struct {
    gint foo;
    gint bar;
  } MyObjectPrivate;

  G_DEFINE_TYPE_WITH_CODE (MyObject, my_object, G_TYPE_OBJECT,
                           G_ADD_PRIVATE (MyObject))

MyObjectPrivate 作为 MyObject 类型的任何实例的私有数据添加。

G_DEFINE_TYPE_* 宏将根据此宏的参数自动创建一个私有函数,该函数可用于从类型实例安全地检索私有数据;比如

  gint
  my_object_get_foo (MyObject *obj)
  {
    MyObjectPrivate *priv = my_object_get_instance_private (obj);

    g_return_val_if_fail (MY_IS_OBJECT (obj), 0);

    return priv->foo;
  }

  void
  my_object_set_bar (MyObject *obj,
                     gint      bar)
  {
    MyObjectPrivate *priv = my_object_get_instance_private (obj);

    g_return_if_fail (MY_IS_OBJECT (obj));

    if (priv->bar != bar)
      priv->bar = bar;
  }

从 GLib 2.72 起,返回的 MyObjectPrivate 指针保证与至少最基本 GLib 类型对齐(通常为 #guint64 或 #gdouble)。如果你需要结构中的元素更大的对齐,你应该在堆(对齐)上分配它,或安排你的 MyObjectPrivate 结构被适当填充。

请注意此宏只能与 G_DEFINE_TYPE_* 宏一起使用,因为它依赖于那些宏的变量名。

另请注意,用这些宏添加的私有结构必须具有 TypeNamePrivate 形式的结构名称。

NULL 或无效对象上调用 _get_instance_private 函数是安全的,因为它仅向实例指针添加一个偏移量。在这种情况下,返回的指针不得间接引用。

从 2.38 开始提供

语言绑定无法直接使用此函数。

参数

TypeName

类型: -

CamelCase 中的类型名称。