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


6.28.1 Calling C functions

C言語の関数関数が宣言されたら(see Declaring C Functions 参照)、 次のように呼び出すことができます: あなたは引数達をスタックにプッシュしてから、 C言語関数のワードを呼び出します。 引数は、 C言語のドキュメントに記載されているのと同じ順序でプッシュする必要があります(つまり、 最初の引数がスタックの最も深いところにあります)。 整数およびポインタ引数はデータ・スタックにプッシュする必要があり、 浮動小数点引数は FP スタックにプッシュする必要があります。 これらの引数は、 呼び出されたC言語の関数によって消費されます。

C言語の関数から戻るとき、 戻り値がある場合、 その戻り値は適切なスタックに置きます。 整数の戻り値はデータ・スタックにプッシュされ、 FP の戻り値は FP スタックにプッシュされ、 void 戻り値の場合は何もプッシュされません。 C言語ではあまり使用されない場合でも、 ほとんどのC言語の関数には戻り値があることに注意してください。 Forth では、 この戻り値を使用しない場合は、 明示的に捨てる(drop)必要があります。

C言語インターフェイスは、 必要に応じて、 ベストエフォートで C言語の型と Forth の型の間で自動的に変換します(場合によっては、 ある程度の損失が発生する可能性があります)。

例として、 POSIX 関数 lseek() について考察してみましょう:

off_t lseek(int fd, off_t offset, int whence);

この関数は 3 つの整数引数を受け取り、 整数引数 1 つ返すため、 現在のファイルのオフセットをファイルの先頭に設定するための Forth 呼び出しは以下のようになります:

fd @ 0 SEEK_SET lseek -1 = if
  ... \ error handling
then

あなたは、 off_t がセルに収まらないため、 lseek に大きなオフセットを渡すことができず、 戻り値の一部しか取得できないのではないかと心配するかもしれません。 その場合、 関数の宣言(see Declaring C Functions)で、off_t 引数と戻り値に 2倍長セルを使用するように宣言し、 結果の Forth ワードに dlseek などの別の名前を付ける必要があります。 その結果は以下のように呼び出すことができます:

fd @ #0. SEEK_SET dlseek #-1. d= if
  ... \ error handling
then

構造体または共用体の受け渡しは現在、 このインターフェイスではサポートされていません35

可変個の引数を持つ関数の呼び出し(「variadic関数」例: printf())は、 引数パターンごとに 1 つの関数呼び出しワードを宣言し、 目的のパターンに適切なワードを呼び出すことによってのみサポートされます。


Footnotes

(35)

あなたが C 言語コンパイラの呼び出し規則を知っていれば、 通常は何らかの方法でそのような関数を呼び出すことはできますが、 その方法は通常、 プラットフォーム間で移植可能ではなく、 場合によっては C 言語コンパイラ間でさえ移植可能ではありません。