GTK+ コードでシグナル ハンドラーを設定するという問題に何度もぶつかりましたが、いくつかのパラメーターは必要なく、いくつかのシグナルのハンドラーとして同じ関数を使用したくなりました。そのハンドラーは異なるシグネチャーを持っていますが、最初の N 個の引数 (私が気にするもの)同じです。
関数が期待する引数よりも少ない引数を期待している場合、関数へのポインターを GObject API に渡すことは安全ですか (「私の PC で動作しますか?」というより実用的な意味ではなく、未定義の動作ではないという意味で)。実際に信号放出プロセスから取得しますか?
または、これを GTK+ から切り離すために、このコードは大丈夫ですか?
/* Note: No void *userdata argument! */
void show(int x) {
printf("x = %d\n", x);
}
void do_stuff(void (*fn)(int, void *), void *userdata) {
static int total = 0;
(*fn)(total, userdata);
total++;
}
void doitnow(void) {
do_stuff(&show, NULL);
}
追加のクレジットとして、関数シグネチャと呼び出しサイトの間のさまざまな戻り値の型の意味について説明してください。
編集:ほぼ同じ質問が「互換性のある関数タイプ」をより綿密に調査し、GObjectシグナルハンドラーをチェーンするという私の具体的な問題に直接対処する答えを引き出します。TL;DR:はい、未定義の動作ですが、一部のツールキットでは (必須ではありませんが) 実際には慣用的です。