你能施放此類型的函數指針:你可以將一個指向一種類型的函數的指針轉換爲另一種類型的函數嗎?
void (*one)(int a)
這種類型之一:
void (*two)(int a, int b)
,然後安全地調用指向的與額外的參數(S)擁有的功能被投了?我曾認爲這樣的事情是非法的,兩種功能類型必須兼容。 (意思是相同的原型 - 同樣的返回值,同樣的參數列表。)但是,這正是的GTK +代碼這一點似乎是在做(從here拍攝):如果你看到了「點擊
g_signal_connect_swapped(G_OBJECT(button), "clicked",
G_CALLBACK(gtk_widget_destroy), G_OBJECT(window));
「信號(或者只是看看從第一環節其使用的其他的例子),你會看到它的處理程序,預計聲明如下:
void user_function(GtkButton *button, gpointer user_data);
當你通過函數g_signal_connect_swapped註冊處理程序()時,小部件指針和數據指針參數按順序交換,因此聲明應該看起來像這樣:
void user_function(gpointer user_data, GtkButton *button);
這是問題所在。註冊爲回調gtk_widget_destroy()函數的原型是這樣的:
void gtk_widget_destroy(GtkWidget *widget);
只取一個參數。據推測,這是因爲數據指針(一個GtkWindow)和指針到信令微件(一個的GtkButton)被交換時,它接收將是窗口指針唯一的參數,並且按鈕指針,這將在以後通過,將靜默被忽略。一些谷歌搜索已經出現了類似的例子,甚至像gtk_main_quit()這樣的函數的註冊根本沒有任何參數。
我是在相信這是一個標準的違反正確嗎? GTK +開發人員是否發現了一些合法的魔法來使這一切工作?
Dupe:http://stackoverflow.com/questions/188839/function-pointer-cast-to-different-signature – 2010-01-07 18:48:21