在gstreamer的源码中,看到了GST_BOILERPLATE_FULL宏的定义,原来在这个宏中就定义着_base_init, _init, _class_init这些函数的原型,难怪我们的源码中不需要定义这些函数原型呢,而且这个宏中最重要的就是可以说明我们的plugin是继承自哪个 class的(看GObject的相关内容),而且这个宏最重要的就是调用了gst_type_register_static_full函数,将 _base_init, _init, interface等等这些内容全部注册进了gstreamer。
OK,在这个宏的定义部分,就看到了##这样的代码,这是什么意思?这其实表示连接字符串,很特别。比如:
#define GST_BOILERPLATE_FULL(type, type_as_function, parent_type, parent_type_macro, additional_initializations) \
\
static void type_as_function ## _base_init (gpointer g_class); \
......
.....
....
这里type_as_function是我们传入GST_BOILERPLATE_FULL的第二个参数,比如是 gst_passthrough,那么,这里static void type_as_function ## _base_init最后就变成了static void gst_passthrough_base_init了,这就是_base_init函数的申明了,amazing.
OK,在这个宏的定义部分,就看到了##这样的代码,这是什么意思?这其实表示连接字符串,很特别。比如:
#define GST_BOILERPLATE_FULL(type, type_as_function, parent_type, parent_type_macro, additional_initializations) \
\
static void type_as_function ## _base_init (gpointer g_class); \
......
.....
....
这里type_as_function是我们传入GST_BOILERPLATE_FULL的第二个参数,比如是 gst_passthrough,那么,这里static void type_as_function ## _base_init最后就变成了static void gst_passthrough_base_init了,这就是_base_init函数的申明了,amazing.