成函数宏

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(),而不会破坏 APIABI。作为一个预防措施,因此你应该使用 G_DECLARE_FINAL_TYPE(),直到你确定你的类可以被子类化。类结构暴露后,不可能改变其大小或删除或重新排列项目而不破坏 API 和/或 ABI。如果你想声明你自己的类结构,请使用 G_DECLARE_DERIVABLE_TYPE()。如果你想声明一个类而不公开类或实例结构,请使用 G_DECLARE_FINAL_TYPE()。

如果你必须使用 G_DECLARE_DERIVABLE_TYPE(),你应该确保在类结构的底部包含一些填充,以便为后来添加虚拟函数留出空间。

自版本 2.44 起可用

此函数不能直接用于语言绑定。

参数

ModuleObjName

类型: -

新类型的名称,采用驼峰式书写法(如 GtkWidget)。

module_obj_name

类型: -

新类型的名称,采用小写,单词用 _ 分隔(如 gtk_widget)。

MODULE

类型: -

模块名称,全部采用大写(如 GTK)。

OBJ_NAME

类型: -

类型名称,全部采用大写(如 WIDGET)。

ParentName

类型: -

父类型名称,驼峰风格(如GtkWidget)。