1 に答える
Jack API が C 言語用に作成されていると仮定すると、実際に動作するコールバックにはすでに正式な問題があります。つまり、それは である必要がありextern "C"
、静的メンバー関数としてはそうではありません。したがって、正式には独立した関数である必要があります。
リンク先のドキュメントjack_set_error_function
には、おそらく C で表現されているこの署名が記載されています。
void jack_set_error_function( void(*)(const char *) func);
C++ の場合、コールバックは であると想定する必要があるextern "C"
ため、
extern "C" void MyErrorFunction( char const* errorMessage )
{
// Whatever, e.g. post a message to the GUI event queue, or terminate.
}
この関数でオブジェクトのメソッドを呼び出したい場合は、ライブラリが特別なメカニズムを提供しない限り、次の手法のいずれかを使用する必要があります。
コールバックによってアクセスされる名前空間スコープ変数、または
動的に生成されたコールバック。
C++ はまだ 2 番目のアプローチをまったくサポートしていないため 、オブジェクトのメソッドでコールバックが必要な場合は、最初のアプローチが強く示されます。
編集:申し訳ありませんが、言及するのを忘れていました、
API ドキュメントの関数宣言は構文的に無効です。
例: ドキュメントの署名
void jack_set_info_function( void(*)(const char *) func );
標準準拠のコンパイラではコンパイルできません。C ではなく、C++ でもありません。どちらの言語でも構文的に無効です。
代わりに
void jack_set_info_function( void(*func)(const char *) );
ドキュメンテーションは明らかに DOxygen によって生成されているため、コンパイル可能なソース コードから生成されていることは当然です。もしそうなら、これは DOxygen のバグであり、ライブラリ プロバイダの品質保証の問題です。しかし、それは単にライブラリ プロバイダに問題があるのでしょうか、それとも、これが C ライブラリであるという仮定が間違っているのでしょうか?