私の図書館は、私の図書館のユーザーが情報を取得するために登録できるコールバック ポイントを提供します。コールバックの一般的な形式は、int型が int 値に依存するさまざまなパラメーターが続きます。そこで、以下のようにコールバックの型とそれを設定する関数を定義しました。
typedef void (* callback_func_t)(int type, ...);
void set_callback_func(callback_func_t callback);
私のライブラリ内で、私はこの関数をずっと呼び出しており、ユーザー セット関数、または私が提供しているデフォルトの関数です。できます。
ここで、いくつかの登録済みコールバックを呼び出せるように、間接的なレベルを追加したいと思います。問題は、まだ省略記号パラメーターを受け取る内部コールバック関数が、省略記号を使用してコールバック関数を呼び出さなければならないことです。結果として、私の内部関数は を解釈しtype、 からパラメータをアンパックして、パラメータva_listとして callbacj 関数に渡す必要があります。
void internal_callback(int type, ...) {
va_list args;
va_start(args, type);
switch (type) {
case 0: call_callback(type, va_arg(args, int)); break;
// ...
}
va_end(args);
}
ただし、ユーザーのコールバックの実装では、va_listの値に応じて、同じ使用方法と引数の解釈も行われますtype。解決策は、コールバック関数への引数として を直接渡しva_list、内部コールバック関数の実装を明確にすることです。
typedef void (* callback_func_t)(int type, va_list args);
va_list私の質問は次のとおりです。引数として取るコールバック関数の型を定義するのは良い習慣ですか? 上記のようにコールバック関数の型を定義できますが、上の定義と比較して長所と短所は何ですか?