函数宏
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
类型定义为_MyAppWindow
的typedef
。该结构本身没有定义,应该在 .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(),而不会破坏 API 或 ABI。因此,作为预防措施,您应该使用 G_DECLARE_FINAL_TYPE(),直到您确定对您的类进行子类化有意义。一旦公开类结构,就不可能更改其大小或删除或重新排序项,而不会破坏 API 和/或 ABI。
自 2.44 起提供
此函数不直接可用于语言绑定。