0
4

1 に答える 1

2

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 ライブラリであるという仮定が間違っているのでしょうか?

于 2012-12-24T03:08:00.960 に答える