¿Se puede convertir un puntero función de este tipo:¿Se puede convertir un puntero a una función de un tipo en una función de otro tipo que toma argumentos adicionales?
void (*one)(int a)
a uno de este tipo:
void (*two)(int a, int b)
y luego invocar de forma segura al cual apunta a la función con los argumentos adicionales (s) que tiene ha sido lanzado para tomar? Había pensado que tal cosa era ilegal, que ambos tipos de funciones tenían que ser compatibles. (Es decir, el mismo prototipo - el mismo valor de retorno, la misma lista de parámetros.) Pero eso es exactamente lo que parece este trozo de código GTK + para estar haciendo (tomado de here):
g_signal_connect_swapped(G_OBJECT(button), "clicked",
G_CALLBACK(gtk_widget_destroy), G_OBJECT(window));
Si nos fijamos el "clic "señal (o simplemente un vistazo a otros ejemplos de su uso desde el primer enlace), se verá que se espera que sus manipuladores para ser declarado como esto:
void user_function(GtkButton *button, gpointer user_data);
cuando se registra un controlador a través de g_signal_connect_swapped(), el Los argumentos del puntero del widget y del puntero de datos se intercambian en orden, por lo tanto, la declaración debería verse como esta en su lugar:
void user_function(gpointer user_data, GtkButton *button);
Aquí está el problema. La función gtk_widget_destroy() registrada como una devolución de llamada es un prototipo de esta manera:
void gtk_widget_destroy(GtkWidget *widget);
a tomar sólo un único argumento. Presumiblemente, debido a que el puntero de datos (una GtkWindow) y el puntero al widget de señalización (un GtkButton) se intercambian, el único argumento que recibe será el puntero de la ventana, y el puntero del botón, que se pasará después, se ignorará silenciosamente . Algunos Google ha encontrado ejemplos similares, incluso el registro de funciones como gtk_main_quit() que no toman ningún argumento.
¿Estoy en lo cierto al creer que se trata de una violación de las normas? ¿Los desarrolladores de GTK + han encontrado algo de magia legal para que todo esto funcione?
Dupe: http://stackoverflow.com/questions/188839/function-pointer-cast-to-different-signature –