Next: , Previous: , Up: C Interface   [Contents][Index]


6.28.6 Callbacks

場合によっては、 C言語の関数へ関数のポインタを渡す必要があります。 つまり、 ライブラリがアプリケーションにコールバックしたい場合です(ポイント先の関数はコールバック関数と呼ばれます)。 既存のC言語の関数のアドレス(lib-sym で取得。 see Low-Level C Interface Words)を渡すことができますが、 適切な C言語の関数がない場合、 あなたは Forth ワードをC言語の関数として定義したい筈です。 その際は、 下記にて説明する、 コールバックを生成する必要があります:

c-callback を使用して Forth コードからC言語のコールバックを生成できます。

c-callback ( "forth-name" "{type}" "–" "type" –  ) gforth-1.0 “c-callback”

指定のシグネチャ forth-name を使用してコールバック・インスタンス化器(instantiator;インスタンシエーター)を定義します。 コールバック・インスタンス化器 forth-name ( xt -- addr ) は、 xt を受け取り、 そのコールバックを処理する C言語関数の addr を返します。

c-callback-thread ( "forth-name" "{type}" "–" "type" –  ) gforth-1.0 “c-callback-thread”

指定のシグネチャ forth-name を使用してコールバック・インスタンス化器を定義します。 コールバック・インスタンス化器 forth-name ( xt -- addr ) は、 xt を受け取り、 そのコールバックを処理する C言語の関数の addr を返します。 このコールバックは、 別のスレッドから呼び出された場合に安全です

これにより、 (value callback# までの)多数のコールバック関数がプリコンパイルされます。 C言語の関数プロトタイプは、 Forth シグネチャから推定されます。 これでは不十分な場合は、 Forth 型の後に中かっこで囲んで型を追加できます。

c-callback vector4double: f f f f -- void
c-callback vector4single: f{float} f{float} f{float} f{float} -- void