Können Sie werfen einen Funktionszeiger dieser Art:Können Sie einen Zeiger auf eine Funktion eines Typs in eine Funktion eines anderen Typs umwandeln, die zusätzliche Argumente benötigt?
void (*one)(int a)
einem dieser Art:
void (*two)(int a, int b)
und rufen Sie dann sicher das spitze zu den zusätzlichen Argumente (s) fungiert es hat wurde geworfen zu nehmen? Ich hatte gedacht, dass so etwas illegal ist, dass beide Funktionstypen kompatibel sein müssen. (Gemeint ist den gleichen Prototyp - gleichen Rückgabewert, gleiche Parameterliste). Aber das ist genau das, was das Bit von GTK + Code erscheint (von here genommen) zu tun:
g_signal_connect_swapped(G_OBJECT(button), "clicked",
G_CALLBACK(gtk_widget_destroy), G_OBJECT(window));
Wenn Sie die „geklickt nachschlagen "-Signal (oder gerade Blick auf andere Beispiele für die Verwendung von der ersten Link), werden Sie so sehen, dass deklariert werden, um seine Handler erwartet:
void user_function(GtkButton *button, gpointer user_data);
Wenn Sie einen Handler über g_signal_connect_swapped registrieren(), die Widgetzeiger und Datenzeigerargumente werden in der Reihenfolge vertauscht. Daher sollte die Deklaration stattdessen folgendermaßen aussehen:
void user_function(gpointer user_data, GtkButton *button);
Hier ist das Problem. Die gtk_widget_destroy() Funktion als Rückruf registriert wird wie folgt prototypisiert:
void gtk_widget_destroy(GtkWidget *widget);
nur ein einziges Argument zu nehmen. Vermutlich, weil der Datenzeiger (ein GtkWindow) und der Zeiger auf das Signalisierungs-Widget (ein GtkButton) vertauscht sind, ist das einzige Argument, das es empfängt, der Fensterzeiger und der Tastenzeiger, der nachher übergeben wird, wird im Hintergrund ignoriert . Etwas Googeln hat ähnliche Beispiele aufgetaucht, sogar die Registrierung von Funktionen wie gtk_main_quit(), die überhaupt keine Argumente annehmen.
Bin ich richtig, wenn ich glaube, dass dies eine Standardverletzung ist? Haben die GTK + -Entwickler eine legale Magie gefunden, um das alles zu funktionieren?
Dupe: http://StackOverflow.com/Questions/188839/Function-Pointer-cast-to-different-Signature –