Ich stoße immer wieder auf das Problem, Signalhandler im GTK + -Code einzurichten, ohne mehrere Parameter zu benötigen und die gleiche Funktion wie der Handler für mehrere Signale zu verwenden, deren Handler unterschiedliche Signaturen haben - aber mit dem ersten N Argumente (die mir wichtig sind) gleich.Ist es sicher, eine C-Funktion mit mehr Argumenten aufzurufen, als sie erwartet?
Ist es sicher (in dem Sinne, dass es kein undefiniertes Verhalten ist, eher als der pragmatische Sinn von "funktioniert es auf meinem PC?") Zeiger auf Funktionen an die GObject API zu übergeben, wenn diese Funktionen weniger erwarten Argumente, als sie tatsächlich aus dem Signalemissionsprozess erhalten werden?
Oder, um sich von GTK + zu trennen, ist dieser Code okay?
Für zusätzliche Kredit, diskutieren die Auswirkungen der verschiedenen Rückgabewerttypen zwischen Funktion Signatur und Call-Site.
Edit: Ein almost-identical question Sonden „kompatibel Typ Funktion“ enger und zieht an answer directly addressing my concrete problem - das GObject Signal-Handler von Verkettungs. TL; DR: Ja, es ist undefiniertes Verhalten, aber es ist praktisch idiomatisch (obwohl nicht obligatorisch) in einigen Toolkits.
Ich bin fast sicher, dass die Konvertierung des Funktionszeigers auf diese Weise UB ist. – Flexo
@Flexo Die Konvertierung des Funktionszeigers ist in Ordnung. Verwenden Sie es für etwas anderes als die Konvertierung zurück, auf der anderen Seite, ... –
BTW, keine Notwendigkeit für '(* Fn)' in do_stuff. Rufen Sie einfach 'fn (total, userdata)' auf. Da 'fn' ein Funktionszeiger ist, erfüllt der Funktionsaufrufoperator' (total, userdata) genau das, was Sie erwarten. – Jens