### Function Macro

# GObject DEFINE_TYPE_EXTENDED

since: 2.4

#### Declaration

    #define G_DEFINE_TYPE_EXTENDED (
      TN,
      t_n,
      T_P,
      _f_,
      _C_
    )

#### Description

The most general convenience macro for type implementations, on which G_DEFINE_TYPE(), etc are based.

    G_DEFINE_TYPE_EXTENDED (GtkGadget,
                            gtk_gadget,
                            GTK_TYPE_WIDGET,
                            0,
                            G_ADD_PRIVATE (GtkGadget)
                            G_IMPLEMENT_INTERFACE (TYPE_GIZMO,
                                                   gtk_gadget_gizmo_init));

expands to

    static void     gtk_gadget_init       (GtkGadget      *self);
    static void     gtk_gadget_class_init (GtkGadgetClass *klass);
    static gpointer gtk_gadget_parent_class = NULL;
    static gint     GtkGadget_private_offset;
    static void     gtk_gadget_class_intern_init (gpointer klass)
    {
      gtk_gadget_parent_class = g_type_class_peek_parent (klass);
      if (GtkGadget_private_offset != 0)
        g_type_class_adjust_private_offset (klass, &GtkGadget_private_offset);
      gtk_gadget_class_init ((GtkGadgetClass*) klass);
    }
    static inline gpointer gtk_gadget_get_instance_private (GtkGadget *self)
    {
      return (G_STRUCT_MEMBER_P (self, GtkGadget_private_offset));
    }

    GType
    gtk_gadget_get_type (void)
    {
      static GType static_g_define_type_id = 0;
      if (g_once_init_enter_pointer (&static_g_define_type_id))
        {
          GType g_define_type_id =
            g_type_register_static_simple (GTK_TYPE_WIDGET,
                                           g_intern_static_string ("GtkGadget"),
                                           sizeof (GtkGadgetClass),
                                           (GClassInitFunc) gtk_gadget_class_intern_init,
                                           sizeof (GtkGadget),
                                           (GInstanceInitFunc) gtk_gadget_init,
                                           0);
          {
            GtkGadget_private_offset =
              g_type_add_instance_private (g_define_type_id, sizeof (GtkGadgetPrivate));
          }
          {
            const GInterfaceInfo g_implement_interface_info = {
              (GInterfaceInitFunc) gtk_gadget_gizmo_init
            };
            g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
          }
          g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id);
        }
      return static_g_define_type_id;
    }

The only pieces which have to be manually provided are the definitions of the instance and class structure and the definitions of the instance and class init functions.

Available since: 2.4

This function is not directly available to language bindings.

#### Parameters

`TN`

  Type: `-`

  The name of the new type, in Camel case.

`t_n`

  Type: `-`

  The name of the new type, in lowercase, with words separated by `_`.

`T_P`

  Type: `-`

  The `GType` of the parent type.

`_f_`

  Type: `-`

  `GTypeFlags` to pass to g_type_register_static().

`_C_`

  Type: `-`

  Custom code that gets inserted in the `*_get_type()` function.