이 형식의 함수 포인터를 캐스팅 할 수 있습니까?한 유형의 함수에 포인터를 추가 인수를 사용하는 다른 유형의 함수에 캐스트 할 수 있습니까?
void (*one)(int a)
를
void (*two)(int a, int b)
중 하나로 변환 한 다음 추가 인수를 사용하여 pointed-to 함수를 안전하게 호출 할 수 있습니까? 캐스팅 해? 나는 그러한 것들이 불법이라고 생각 했었고, 두 함수 유형 모두 호환되어야했다. (동일한 프로토 타입 - 동일한 반환 값, 동일한 매개 변수 목록을 의미합니다.)하지만 바로 이것이 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)에 대한 포인터가 바뀌기 때문에받는 유일한 인수는 윈도우 포인터가 될 것이고, 이후에 전달 될 버튼 포인터는 무시 될 것이다 . 몇몇 Googling은 인수를 전혀 사용하지 않는 gtk_main_quit() 같은 함수의 등록조차도 비슷한 예제를 보여줍니다.
이것이 표준 위반이라고 생각하는 것이 맞습니까? GTK + 개발자가이 모든 작업을 수행 할 수있는 몇 가지 법적 마법을 찾았습니까?
Dupe : http://stackoverflow.com/questions/188839/function-pointer-cast-to-different-signature –