函数宏

GObjectDECLARE_FINAL_TYPE

since: 2.44

声明 [src]

#define G_DECLARE_FINAL_TYPE (
  ModuleObjName,
  module_obj_name,
  MODULE,
  OBJ_NAME,
  ParentName
)

说明 [src]

一个用于在类型头文件中生成常规声明的实用宏,此类型(在当前)不打算作为子类。

您可以在头文件中像下面这样使用它

#ifndef _myapp_window_h_
#define _myapp_window_h_

#include <gtk/gtk.h>

#define MY_APP_TYPE_WINDOW my_app_window_get_type ()
G_DECLARE_FINAL_TYPE (MyAppWindow, my_app_window, MY_APP, WINDOW, GtkWindow)

MyAppWindow *    my_app_window_new    (void);

...

#endif

并在 C 文件中像下面这样使用它

struct _MyAppWindow
{
 GtkWindow parent;
 ...
};
G_DEFINE_TYPE (MyAppWindow, my_app_window, GTK_TYPE_WINDOW)

这会生成以下内容

  • 常规的 my_app_window_get_type() 函数声明的返回类型为 GType

  • MyAppWindow 类型定义为 _MyAppWindowtypedef。该结构本身没有定义,应该在 .c 文件中定义,然后再使用 G_DEFINE_TYPE()。

  • MY_APP_WINDOW() 强制转换会与 MY_APP_IS_WINDOW() 类型检查函数一起作为 static inline 函数生成

  • MyAppWindowClass 类型定义为包含 GtkWindowClass 的结构。这样做的目的是为了方便定义该类型的人员,不应将其视为 ABI 的一部分。具体而言,在没有明确声明实例结构的情况下,不可能对类型进行子类化,因此公开类结构的大小无关紧要,未来任何时候都可以随意更改。

  • g_autoptr() 支持基于父类类型为您的类型添加

只有当您的父类型也支持 g_autoptr() 时才能使用此功能。

由于类型宏(在上面的示例中为 MY_APP_TYPE_WINDOW)不是可调用的,因此您必须继续手动将此定义为您自己的宏。

_get_type() 函数的声明是此宏输出的第一项内容。这允许在使用导出控件和 API 版本控制宏时以通常的方式使用此宏。

如果您想声明自己的类结构,请使用 G_DECLARE_DERIVABLE_TYPE()。

如果您正在编写一个库,请注意,可以将类型从使用 G_DECLARE_FINAL_TYPE() 转换为 G_DECLARE_DERIVABLE_TYPE(),而不会破坏 APIABI。因此,作为预防措施,您应该使用 G_DECLARE_FINAL_TYPE(),直到您确定对您的类进行子类化有意义。一旦公开类结构,就不可能更改其大小或删除或重新排序项,而不会破坏 API 和/或 ABI

自 2.44 起提供

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

参数

ModuleObjName

类型: -

新类型名称,采用驼峰式大小写(如 GtkWidget)。

module_obj_name

类型: -

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

MODULE

类型: -

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

OBJ_NAME

类型: -

类型的基本名称,采用全大写(如 WIDGET)。

ParentName

类型: -

父类型名称,采用驼峰式大小写(如 GtkWidget)。