GtkWidget *, возвращаемый из функции, приводит к ошибке сегментации - PullRequest
0 голосов
/ 01 марта 2019

Я спрашиваю, почему, если я решу вызвать функцию в другом файле, возвращаемый 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, все работает нормально, но это не настоящее решение.

Заранее спасибо

1 Ответ

0 голосов
/ 02 марта 2019

Я получаю много предупреждений (которые я там записал), но без ошибок.

Это опасное мышление с C, где любое предупреждение может быть абсолютно фатальным.Я рекомендую использовать -Wall с gcc при разработке (и только расслабляя это для определенных случаев).

В этом случае компилятор предупреждает вас так:

main.c:6:17: warning: implicit declaration of function ‘new_widget’

В C это означаетподпись по умолчанию int new_widget() затем используется при вызове вашей функции.Ваша действительная сигнатура функции, конечно же, не соответствует этому, поэтому плохие вещи начинают происходить.

Вы можете исправить это, добавив файл заголовка, который содержит правильную сигнатуру функции, и #include, что заголовок в вашем main.c.

...