2014-01-15 28 views
0

g_signal_connect()需要gpointer,字符常數,GCallback和另一gpointer作爲參數。使用GTK對g_signal_connect()進行「正確」轉換?

我通過GTK +書的基礎,現在閱讀,它只是發生,我認爲筆者傾向於投的第一個參數爲G_OBJECT,最後作爲(gpointer),儘管兩者都定義爲gpointer的在函數簽名中,兩個參數都是GtkWidget s。

那麼,哪個(如果有的話)是最適合此功能的演員?使用兩個不同的演員似乎很奇怪。

回答

1

一個小點,但g_signal_connect()實際上是一個叫g_signal_connect_data()的宏 - 不是它真的有什麼區別。不過,您列出的參數類型是正確的。

在C中,任何指針類型都可以隱式轉換爲void*(又名gpointer),因此根本不需要顯式強制類型轉換。事實上,第一個參數的類型爲gpointer而不是GObject*的全部原因是爲了節省您不得不做的手動轉換。我還沒有看過這本書,但至少可以說,作者所定下的這個約定頗不尋常。我不認爲我已經看到任何GObject代碼「在野外」完成。

順便說一句,如果你將一個GObject到另一個 - 例如,如果信號的接收方是GtkWidget - 那麼最好使用g_signal_connect_object()而不是一個普通的g_signal_connect()。如果你這樣做,它將確保當接收對象被銷燬時信號自動斷開,否則你需要在接收器的析構函數中手動處理。

希望這會有所幫助!

+0

請注意,'g_signal_connect_object'文檔說'GObject中存在一個錯誤,使得這個函數的用處遠不如別的。一旦gobject被處置,回調將不再被調用,但是,信號處理程序當前沒有被斷開。如果實例本身在同一時間被釋放,這並不重要,因爲信號將被自動刪除,但如果實例持續存在,則信號處理程序將會泄漏。您不應該自己移除信號,因爲在將來的GObject版本中,處理程序會自動斷開連接。# – liberforce

+0

快速谷歌:https://www.google.co.uk/?gws_rd=cr&ei=jcb6UrjLJIWq0QX65oGQDQ#q=G_OBJECT + g_signal_connect表明在不需要的情況下投射到G_OBJECT當然是'野外'中的常見習慣用法 – iain

2

您不必爲第一個參數使用G_OBJECT()強制轉換宏:GSignal API不需要GObject-它可以與任何GTypeInstance實現一起使用。

除非您使用C++編譯器,否則您也不需要將最後一個參數轉換爲gpointer; gpointer是一個typedef到void *,和指針大小類型和void *之間的轉換是在C.

+0

要添加到此:G_OBJECT()宏將執行強制檢查,並在傳入非GObject類型時產生警告。 – iain

1

除了其他的答案隱含:它是從舊的GTK +1天殘餘當函數是gtk_signal_connect和它作爲第一個參數採取了GtkObject