Я пытаюсь освоить библиотеку GObject. Поэтому я попытался создать простой Gtk + Custom Widget, наследуя от GtkHBox. Я не могу понять, в чем проблема или даже где проблема, поэтому мне придется вставить весь код. Вот код:Невозможно понять странную ошибку времени выполнения C. Нужна помощь?
notetab.h
#ifndef NOTETAB_H
#define NOTETAB_H
G_BEGIN_DECLS
#define PRO_NOTE_TAB(obj) GTK_CHECK_CAST(obj, pro_note_tab_get_type(), ProNoteTab)
#define GTK_CPU_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, pro_note_tab_get_type(), ProNoteTabClass)
#define GTK_IS_CPU(obj) GTK_CHECK_TYPE(obj, pro_note_tab_get_type())
typedef struct _ProNoteTab ProNoteTab;
typedef struct _ProNoteTabClass ProNoteTabClass;
struct _ProNoteTab
{
GtkWidget hbox;
GtkObject parent_instance;
GtkLabel label;
GtkButton cbtn;
};
struct _ProNoteTabClass
{
GtkHBoxClass parent_class;
};
GtkType pro_note_tab_get_type(void);
GtkWidget* pro_note_tab_new(void);
G_END_DECLS
#endif
notetab.c
#include "common.h"
#include "notetab.h"
GtkType pro_note_tab_get_type()
{
GtkType pro_note_tab_type = 0;
if (!pro_note_tab_get_type)
{
static const GtkTypeInfo pro_note_tab_info =
{
"ProNoteTab",
sizeof(ProNoteTab),
sizeof(ProNoteTabClass),
(GtkClassInitFunc) NULL,
(GtkObjectInitFunc) NULL,
NULL,
NULL,
(GtkClassInitFunc) NULL
};
pro_note_tab_type = gtk_type_unique(GTK_TYPE_WIDGET, &pro_note_tab_info);
}
return pro_note_tab_type;
}
GtkWidget* pro_note_tab_new(void)
{
return GTK_WIDGET(gtk_type_new(pro_note_tab_get_type()));
}
Теперь программа компилирует прекрасно. Но ошибка я получаю во время выполнения:
GTK_CRITICAL **: IA__gtk_type_new: утверждение
GTK_TYPE_IS_OBJECT(type) failed
GTK_CRITICAL **: IA__gtk_container_add: утверждениеGTK_IS_WIDGET(widget) failed
Что я делаю неправильно? Или даже я, о чем в мире эта ошибка?
Попробуйте выполнить компиляцию со всеми предупреждениями, то есть опцию '-Wall' в' gcc' ... Вы обязательно получите предупреждение в 'if (! Pro_note_tab_get_type)', как указано @Lews Therin, это должно быть 'if (pro_note_tab_type) 'без ** get ** в имени переменной, которое может быть причиной проблемы. Также рассмотрите предложение @unwind, связанное с 'static' –
Возможно, вы захотите проверить' G_DEFINE_TYPE() ', который будет расширяться до большей части приведенного выше кода для вас, с добавленным бонусом, что будет намного сложнее для ошибок пробираться туда. – ptomato
@ptomato Спасибо. – ApprenticeHacker