“删除事件”信号的回调函数传递了错误的变量值

时间:2018-09-17 06:38:26

标签: c gtk gtk3

每当我在触发"delete-event"时将某项传递给回调函数并意图在退出窗口时清理某项时,我发送的值都会损坏。

例如,这是一个小程序,它说明了此问题:

#include <gtk/gtk.h>

void window_quit(GtkWidget *window, int *v) 
{
        g_print("%d\n", *v);
        gtk_main_quit();
}

void normal_function(int *v) 
{
        g_print("%d\n", *v);
}

int main(int argc, char **argv)
{
        gtk_init(&argc, &argv);
        GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_widget_show(window);
        int v = 5;
        normal_function(&v);
        g_signal_connect(window, "delete-event", G_CALLBACK(window_quit), &v);
        gtk_main();
}

如何在退出时调用函数并传递正确的值?顺便说一句,对于正常调用的函数或其他信号,我没有这个问题。

1 个答案:

答案 0 :(得分:2)

您的信号处理程序的类型不适用于"delete-event"The reference manual对于GTK3指定必须为:

gboolean
user_function (GtkWidget *widget,
               GdkEvent  *event,
               gpointer   user_data)

您显然不是那样。结果可能是一堆未定义的行为。您看到的损坏数据很可能将GdkEvent修剪为int。尽管框架希望您的函数返回某些内容,但您也不会返回任何值。

由于G_CALLBACK是强制类型转换,然后框架将强制类型转换回预期的函数指针类型,因此命令性是您习惯于阅读有关连接信号的手册的习惯。这里没有类型安全性,编译器无法捕获这些类型的错误。