g_signal_connect()
需要gpointer
,字符常量,GCallback
和其他gpointer
作为参数。
我现在正在阅读GTK +基础书籍,我刚刚想到作者倾向于将第一个参数作为G_OBJECT
而最后一个作为(gpointer)
,即使两者都在函数签名中定义为gpointer
,两个参数都是GtkWidget
s。
那么,哪个(如果有的话)是这个函数最合适的演员?使用两种不同的演员表似乎很奇怪。
答案 0 :(得分:2)
您不必将G_OBJECT()
强制转换宏用于第一个参数:GSignal API不需要GObject - 它可以与任何GTypeInstance实现一起使用。
除非你使用的是C ++编译器,否则你也不需要转换为gpointer
最后一个参数; gpointer
是void *
的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天。