参考:
GObject – 2.0https://docs.gtk.org/gobject/?q=G_DEFINE_TYPE
G_DEFINE_TYPE 做了什么?
以 G_DEFINE_TYPE(GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT); 为例
1.声明了如下几个static函数
static void gst_my_filter_init (GstMyFilter *self);
static void gst_my_filter_class_init (GstMyFilterClass *klass);
static GType gst_my_filter_get_type_once (void);
static gpointer gst_my_filter_parent_class = NULL;
static gint GstMyFilter_private_offset;
2.定义函数
static void gst_my_filter_class_intern_init(gpointer klass)
{
gst_my_filter_parent_class = g_type_class_peek_parent (klass);
if (GstMyFilter_private_offset != 0)
g_type_class_adjust_private_offset (klass, &GstMyFilter_private_offset);
gst_my_filter_class_init ((GstMyFilterClass*) klass);
}
static inline gpointer gst_my_filter_get_instance_private(GstMyFilter *self)
{
...
}
GType gst_my_filter_get_type (void)
{
//GLib 在内部为我们找一个未使用的int类型,然后作为GType返回。
//如果我们想要自行指定int值,可以在这个函数里面实现,具体的流程可以参考
//https://docs.gtk.org/gobject/func.DEFINE_TYPE_EXTENDED.html
}
3.ps
如果不使用 G_DEFINE_TYPE ,则需要自己实现 GType gst_my_filter_get_type (void)
其他扩展的 G_DEFINE_TYPE_XXX函数
GType的创建和管理
定义:
#if GLIB_SIZEOF_SIZE_T != GLIB_SIZEOF_LONG || !defined __cplusplus
typedef gsize GType;
#else /* for historic reasons, C++ links against gulong GTypes */
typedef gulong GType;
#endif
GType类型是一个整形值,本身本没有任何意义,但是它和一个结构体数组相关联:
//长度为255+1的数组,这个数组中每一项都对应一个GType
static TypeNode *static_fundamental_type_nodes[(G_TYPE_FUNDAMENTAL_MAX >> G_TYPE_FUNDAMENTAL_SHIFT) + 1] = { NULL, };
/* --- structures --- */
struct _TypeNode
{
guint ref_count; /* (atomic) */
#ifdef G_ENABLE_DEBUG
guint instance_count; /* (atomic) */
#endif
GTypePlugin *plugin;
guint n_children; /* writable with lock */
guint n_supers : 8;
guint n_prerequisites : 9;
guint is_classed : 1;
guint is_instantiatable : 1;
guint mutatable_check_cache : 1; /* combines some common path checks */
GType *children; /* writable with lock */
TypeData *data;
GQuark qname;
GData *global_gdata;
union {
GAtomicArray iface_entries; /* for !iface types */
GAtomicArray offsets;
} _prot;
GType *prerequisites;
GType supers[1]; /* flexible array */
};
//以GType为缩引查找数组中相应的结构体
static inline TypeNode*
lookup_type_node_I (GType utype)
{
if (utype > G_TYPE_FUNDAMENTAL_MAX)
return (TypeNode*) (utype & ~TYPE_ID_MASK);
else
return static_fundamental_type_nodes[utype >> G_TYPE_FUNDAMENTAL_SHIFT];
}
用户定义的GType的序号起始点为:
static GType static_fundamental_next = G_TYPE_RESERVED_USER_FIRST;