2

一部のユーザー データをコールバックに渡すように API を変更するようにサード パーティのソフトウェア ベンダーを説得する助けが必要です。

これは、コールバックが使用されている場所でよく見られる標準的な方法のようです。彼らの開発チームにこれを行うよう説得する弾薬を探しています。

私の理由は、すべての API 呼び出し (コールバックを受け取るものを除く) に対して 1:1 Python バインディングを作成したからです。API もユーザー データに void* を使用した場合... 例:

SOME_API_register_function(char* name, char* desc, void* callback, void* user_data);

それ以外の...

SOME_API_register_function(char* name, char* desc, void* callback);

これにより、これらの関数のバインディングを作成することがはるかに簡単になります (または可能になることさえあります)。私のバインディングは現在 Cython にあり、有効な C コールバックを動的に作成する機能がありません。私は cffi Python ライブラリがこの機能を提供すると信じていますが、これらのバインディングはパフォーマンスが少し遅く、それをやってのけるために彼らが行っている魔法の種類について心配しています.... また、バインディングを移植したくありません.

問題は、このソフトウェアの顧客にお金を払っているにもかかわらず、新しい機能を提供するどころか、バグを認めてもらうのにも時間がかかることです。弾薬が多ければ多いほど良い。ユーザー データに void* を提供するように指示されているプログラミング ガイド、ベスト プラクティスなどのドキュメントは役に立ちます。

4

1 に答える 1

0

user_data同じ関数を複数登録する場合に必要です。この場合、別のものuser_dataはそれらを区別します。

これはいくつかの場合に役立ちます:

  1. 登録は何らかのオブジェクトに関連しており、これらのオブジェクトが多数存在する場合があります (開いているファイルなど)。開いているファイルごとに個別の関数は必要ありません。

  2. いくつかの登録された関数で基本的に同じことをしたいのですが、その違いはいくつかの値 (数値定数など) で表すことができます。この場合、同じ関数を複数回登録しuser_data、異なる値を含めると便利です。

PSvoid *callbackは悪い定義です。型は、コールバックのパラメーターと戻り値の型を定義する必要があります (できれば a を使用しますtypedef)。

于 2013-10-20T21:41:40.560 に答える