类型

类型

GType API 是 GObject 系统的基础。它提供注册和管理所有基本数据类型、用户定义对象和接口类型方面的功能。

为了类型创建和注册目的,所有类型都属于两个类别之一:静态或动态。静态类型在运行时从不加载或卸载,而动态类型可以。通过 g_type_register_static() 创建静态类型,该类型会通过 GTypeInfo 结构获取特定类型的信息。

通过 g_type_register_dynamic() 创建动态类型,该类型采用 GTypePlugin 结构。通过 GTypePluging_type_plugin_*() API,将在运行时检索剩余的类型信息(GTypeInfo 结构)。

这些注册函数通常只会从一个函数中调用一次,而此函数的唯一目的是返回特定类的类型标识符。一旦注册了类型(或类或接口),便可以根据具体类型的类型进行实例化、继承或实现。

还有一个用于注册基本类型的第三个注册函数,称为 g_type_register_fundamental(),它既需要 GTypeInfo 结构,又需要 GTypeFundamentalInfo 结构,但很少使用,因为大多数基本类型都是预定义的,而不是用户定义的。

类型实例和类结构限制为总共 64 KiB,包括所有父类型。同样,类型实例的私有数据(如由 G_ADD_PRIVATE() 创建的)限制为总共 64 KiB。如果类型实例需要一个大型静态缓冲区,请单独分配它(通常通过使用 GArrayGPtrArray)并将指向缓冲区的指针放置在结构中。

正如 GType 公约 中所述,类型名称必须至少有三个字符长。没有上限长度。第一个字符必须是字母(a-z 或 A-Z)或下划线('\_')。后续字符可以是字母、数字或任何’-_+’。

运行时调试

当在编译期间定义了 G_ENABLE_DEBUG 时,GObject 库支持环境变量 GOBJECT_DEBUG,该变量可以设置为多种标志的组合,以触发有关对象记录和运行时信号发射的调试消息。

当前支持的标志为

  • objects:在名为 debug_objects_ht 的全局散列表中跟踪所有 GObject 实例,并在退出时打印仍然存活的对象。
  • instance-count:跟踪所有 GType 的实例数量,并通过 g_type_get_instance_count() 函数使其可用。
  • signals:当前未使用。