dememax: (glider)
[personal profile] dememax
Как в 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
Т.е., что мне не нравится:
  1. используется одно и то же имя для поля в определении структуры класса, и для глобальной статической переменной.
  2. вспомогательное макро запутывает порядком, к тому же, надо знать, что переопределяемое дефайном имя - промежуточное и используется исключительно в макро 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


https://mpd.livejournal.com/190287.html

Profile

dememax

May 2023

S M T W T F S
 123456
78910111213
14151617181920
21 2223 24252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 29th, 2026 05:05 am
Powered by Dreamwidth Studios