功能宏
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 开始提供
语言绑定无法直接使用此函数。