Я спрашиваю, почему, если я решу вызвать функцию в другом файле, возвращаемый GtkWidget * вызовет ошибку сегментации, если используется (приведение, функция gtk, как в примере, ...)
Здесь в основном я запускаю gtk_init и пробую GTK_IS_WIDGET из функции, определенной в другом файле
main.c
#include <gtk/gtk.h>
#include <glib.h>
int main(){
gtk_init(NULL, NULL);
GTK_IS_WIDGET(new_widget());
}
Там в другом файле я создаю новый GtkWidget и использую функциюGTK_IS_WIDGET, затем я печатаю «ОК», чтобы узнать, наступает ли исполнение в этот моментполучить много предупреждений, (которые я поставил там), но без ошибок.
main.c:6:17: warning: implicit declaration of function ‘new_widget’ [-Wimplicit-function-declaration]
GTK_IS_WIDGET(new_widget());
^
/usr/include/glib-2.0/gobject/gtype.h:2238:44: note: in definition of macro ‘_G_TYPE_CIT’
GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
^~
/usr/include/gtk-2.0/gtk/gtkwidget.h:139:35: note: in expansion of macro ‘G_TYPE_CHECK_INSTANCE_TYPE’
#define GTK_IS_WIDGET(widget) (G_TYPE_CHECK_INSTANCE_TYPE ((widget), GTK_TYPE_WIDGET))
^~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:6:3: note: in expansion of macro ‘GTK_IS_WIDGET’
GTK_IS_WIDGET(new_widget());
^~~~~~~~~~~~~
/usr/include/glib-2.0/gobject/gtype.h:2238:27: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
^
/usr/include/glib-2.0/gobject/gtype.h:495:66: note: in expansion of macro ‘_G_TYPE_CIT’
#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type) (_G_TYPE_CIT ((instance), (g_type)))
^~~~~~~~~~~
/usr/include/gtk-2.0/gtk/gtkwidget.h:139:35: note: in expansion of macro ‘G_TYPE_CHECK_INSTANCE_TYPE’
#define GTK_IS_WIDGET(widget) (G_TYPE_CHECK_INSTANCE_TYPE ((widget), GTK_TYPE_WIDGET))
^~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:6:3: note: in expansion of macro ‘GTK_IS_WIDGET’
GTK_IS_WIDGET(new_widget());
Если я запускаю файл (./main.o
), я получаю сообщение «ОК», которое подтверждает, что GTK_IS_WIDGET внутри функции работалправильно, но затем ошибка сегментации, когда GTK_IS_WIDGET вызывается в main.
Если я объявляю функцию внутри main, все работает нормально, но это не настоящее решение.
Заранее спасибо