成函数宏
GObjectDECLARE_DERIVABLE_TYPE
自版本:2.44
声明 [src]
#define G_DECLARE_DERIVABLE_TYPE (
ModuleObjName,
module_obj_name,
MODULE,
OBJ_NAME,
ParentName
)
说明 [src]
一个方便的宏,用于在标题文件中发出通常的声明,其中包含类型,以便对类型进行子类化。
你可以按照以下方式在标题中使用它
#ifndef _gtk_frobber_h_
#define _gtk_frobber_h_
#define GTK_TYPE_FROBBER gtk_frobber_get_type ()
GDK_AVAILABLE_IN_3_12
G_DECLARE_DERIVABLE_TYPE (GtkFrobber, gtk_frobber, GTK, FROBBER, GtkWidget)
struct _GtkFrobberClass
{
GtkWidgetClass parent_class;
void (* handle_frob) (GtkFrobber *frobber,
guint n_frobs);
gpointer padding[12];
};
GtkWidget * gtk_frobber_new (void);
...
#endif
由于实例结构是公有的,所以在 C 文件中通常需要声明一个私有结构,如下所示
typedef struct _GtkFrobberPrivate GtkFrobberPrivate;
struct _GtkFrobberPrivate
{
...
};
G_DEFINE_TYPE_WITH_PRIVATE (GtkFrobber, gtk_frobber, GTK_TYPE_WIDGET)
这将导致以下事件发生
-
通常的
gtk_frobber_get_type()
函数声明为返回类型为GType
-
GtkFrobber
结构与GtkWidget
(作为第一个项目)一起创建。你需要使用从 .c 文件中的私有结构来存储实例变量。 -
GtkFrobberClass
类型定义为struct _GtkFrobberClass
的类型定义,而struct _GtkFrobberClass
保留未定义。在直接使用宏后应该从头文件中完成此操作。 -
GTK_FROBBER()
和GTK_FROBBER_CLASS()
转换将作为static inline
函数发出,以及GTK_IS_FROBBER()
和GTK_IS_FROBBER_CLASS()
类型检查函数和GTK_FROBBER_GET_CLASS()
函数。 -
g_autoptr()
支持添加到你的类型,根据父类类型
你只能在父类型也支持 g_autoptr()
的情况下使用此函数。
因为类型宏(上面示例中的 GTK_TYPE_FROBBER
)不是可调用的,所以你必须继续给自己手动定义这个宏。
_get_type()
函数的声明是宏发出的第一个内容。这样允许宏与导出控制和 API 版本控制宏一起按照通常的方式使用。
如果你正在编写库,则重要的是要注意,可以将类型从使用 G_DECLARE_FINAL_TYPE() 转换到 G_DECLARE_DERIVABLE_TYPE(),而不会破坏 API 或 ABI。作为一个预防措施,因此你应该使用 G_DECLARE_FINAL_TYPE(),直到你确定你的类可以被子类化。类结构暴露后,不可能改变其大小或删除或重新排列项目而不破坏 API 和/或 ABI。如果你想声明你自己的类结构,请使用 G_DECLARE_DERIVABLE_TYPE()。如果你想声明一个类而不公开类或实例结构,请使用 G_DECLARE_FINAL_TYPE()。
如果你必须使用 G_DECLARE_DERIVABLE_TYPE(),你应该确保在类结构的底部包含一些填充,以便为后来添加虚拟函数留出空间。
自版本 2.44 起可用
此函数不能直接用于语言绑定。