https://dememax.dreamwidth.org/185986.html Как в glib, в GStreamer имя "parent_class" используется для определения первого поля структуры нового класса, например:
struct _GTypeModuleClass
{
GObjectClass parent_class;
...Для нового элемента в GStreamer используется макро G_DEFINE_TYPE (которое раскрывается в
DEFINE_TYPE_EXTENDED) из GObject:
https://gitlab.gnome.org/GNOME/glib/-/blob/main/gobject/gtype.hЭто макро рассчитано на использование в исходнике (some_object.c), оно определяет среди прочего статическую глобальную переменную:
static gpointer some_object_parent_class = NULL;В GStreamer идут дальше и используют перед макро G_DEFINE_TYPE дополнительный дефайн:
#define some_object_parent_class parent_classНо обратите внимание, обычно дефайн используется следующим образом:
#define something_new something_already_definedА в этой GStreamer parent_class idiom получается наоборот:
#define something_intermediate new_symbol_that_will_be_usedТ.е., что мне не нравится:
- используется одно и то же имя для поля в определении структуры класса, и для глобальной статической переменной.
- вспомогательное макро запутывает порядком, к тому же, надо знать, что переопределяемое дефайном имя - промежуточное и используется исключительно в макро G_DEFINE_TYPE
Масштаб этого носит такой характер в
моно-репо GStreamer:
> git grep -n -H -E "^ +G[0-9a-zA-Z_]+ +parent_class;$" | wc
1225 3675 117823
> git grep -n -H -E "#define +(\w+_)+parent_class +parent_class$" | wc
748 2244 83736
Update: Совсем забыл сказать, для чего это всё делается (define ..._parent_class parent_class), чтобы не писать длинно:
G_OBJECT_CLASS (some_class_parent_class)->finalize (object);а коратко
G_OBJECT_CLASS (parent_class)->finalize (object);Всё!
Но иногда в исходнике других упоминаний parent_class нет вообще, и это ещё больше меня расстраивает.
Зачем?!
"
Один ответ на это есть!" Boilerplate! В смысле, copy-past technology!
Update 2: Мло того, есть ещё и в обратную сторону:
> git grep -n -H -E "^ *# *define +parent_class +.*_parent_class *$" | wc
146 438 16605
> git grep -n -H -E "^ *# *define +.*_parent_class +parent_class *$" | wc
748 2244 83736