使用GTK“修改”g_signal_connect()的强制转换?

时间:2014-01-15 03:13:23

标签: c gtk glib

g_signal_connect()需要gpointer,字符常量,GCallback和其他gpointer作为参数。

我现在正在阅读GTK +基础书籍,我刚刚想到作者倾向于将第一个参数作为G_OBJECT而最后一个作为(gpointer),即使两者都在函数签名中定义为gpointer,两个参数都是GtkWidget s。

那么,哪个(如果有的话)是这个函数最合适的演员?使用两种不同的演员表似乎很奇怪。

3 个答案:

答案 0 :(得分:2)

您不必将G_OBJECT()强制转换宏用于第一个参数:GSignal API不需要GObject - 它可以与任何GTypeInstance实现一起使用。

除非你使用的是C ++编译器,否则你也不需要转换为gpointer最后一个参数; gpointervoid *的typedef,指针大小类型和void *之间的强制转换隐含在C中。

答案 1 :(得分:1)

一个小问题,但g_signal_connect()实际上是一个调用g_signal_connect_data()的宏 - 而不是它确实有任何区别。但是,您列出的参数类型是正确的。

在C中,任何指针类型都可以隐式转换为void*(又名gpointer),因此根本不需要显式转换。实际上,第一个参数类型gpointer而不是GObject*的全部原因是为了节省您必须进行手动转换。我没有看过这本书,但令我感到震惊的是,作者已经确定的惯例相当......不寻常,至少可以说。我不认为我已经看到任何GObject代码“在野外”这样做。

顺便说一句,如果您将一个GObject与另一个GtkWidget相关联 - 例如,如果信号的收件人是g_signal_connect_object() - 那么最好使用g_signal_connect()而不是普通的{{1}}。如果这样做,它将确保在接收对象被销毁时信号自动断开,否则您需要在接收器的析构函数中手动处理。

希望这有帮助!

答案 2 :(得分:1)

除了其他答案之外:它是旧Gtk的残余+当函数为gtk_signal_connect并且GtkObject作为第一个参数时的1天。