インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

BIND(C)

Fortran 2003 では、キーワード BIND を使用した、language-binding-spec 属性が導入されました。構文は、次のとおりです。

BIND(C [, NAME=scalar-default-char-constant-expr])

C は、指定可能な唯一の言語名です。一般に、BIND(C) 属性を持つエンティティーは、コンパニオン C プロセッサーの対応するエンティティーのように動作します。

オプションの NAME= 指定子を使用すると、標準規格とは異なる、コンパニオン C プロセッサーが Fortran 名を小文字にした外部名を使用できます。C の名前に大文字と小文字が混在して使用されている場合、先頭の下線のような名前の修飾を行わないで、大文字と小文字が混在した名前を指定します。コンパイラーは、C プロセッサーが同じ名前に行う修飾をすべて適用します。そのため、NAME= は ALIAS 属性拡張の厳密な置換ではありません。どちらかといえば、DECORATE と組み合わされた ALIAS に似ています。

BIND(C) は ATTRIBUTES C と同等ではありません。どちらも外部名を小文字にしますが、BIND(C) は値渡しを行わず、ATTRIBUTES C とは異なるほかの影響があります。

互換性のあるプロシージャー (BIND(C) 属性を持つプロシージャー) では、ATTRIBUTES STDCALL を指定することができます。この組み合わせにより、IA-32 アーキテクチャー向け Windows* アプリケーションでは次の影響が生じます。

STDCALL によるその他の効果 (値渡しなど) は得られません。必要に応じて、Fortran 標準の VALUE 属性 (ATTRIBUTES VALUE ではない) を使用できます。その他のプラットフォームでは、BIND(C) 属性を持つ STDCALL を指定しても効果はありません。詳細は、ATTRIBUTES C および STDCALLを参照してください。

プロシージャーの BIND(C)

BIND(C) はプロシージャーでよく使用されます。外部の互換性のあるプロシージャーのインターフェイスを指定する INTERFACE ブロック、または互換性を持たせたいすべての Fortran プロシージャーで指定することができます。SUBROUTINE および FUNCTION では、引数リストの後に BIND(C) を指定する必要があります。関数では、RESULT 節の前または後に BIND(C) を指定することができます。次に例を示します。

SUBROUTINE INTEROP_SUB (ARG) BIND(C,NAME="InteropSub")

FUNCTION INTEROP_FUN (ARG) BIND(C,NAME="InteropFun") RESULT (IAMFUN)

上記の例には必要のない外部名が含まれています。:: 区切り文字の前にある属性のリストに含まれる場合、PROCEDURE 宣言で BIND(C) を指定することもできます。

プロシージャーで BIND(C) を指定すると、次のようになります。

標準規格では、互換性のあるプロシージャーに文字列を渡すことを許可しています。デフォルトの種別 (インテル® Fortran では種別 C_CHAR がデフォルト) の文字引数を渡すことができます。対応する仮引数は、単一文字の形状明示配列です。長さは渡されないため、別の方法で長さを提供する必要があります (通常は、最後に NUL 文字を追加します)。

標準規格では、C から文字列を受け付ける Fotran の互換性のあるルーチンを簡単に記述できる方法は提供されません。C_LOC および C_F_POINTER プロシージャー (どちらも組込みモジュール ISO_C_BINDING で定義される) の組み合わせを使用して、文字列への Fortran ポインターに文字配列引数を「キャスト」することができます。次に例を示します。

subroutine Interop_sub(arg) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING
CHARACTER, DIMENSION(*) :: ARG
CHARACTER(1000), POINTER :: LCL_ARG ! 引数へのローカルポインター
CALL C_F_POINTER(C_LOC(ARG), LCL_ARG)

上記の例で、ARG は、長さのない単一文字の大きさ引き継ぎ配列です。C_F_POINTER サブルーチンは、C ポインターを Fortran ポインターに変換します。C_LOC は、引数の (型 C_PTR の) C ポインターを取得して Fortran ポインター LCL_ARG に変換するために使用されます。つまり、LCL_ARG を文字列として使用してもかまわないということです。

例では、LCL_ARG は明示的な長さを持っています。このポインターを、取得する文字列の正しい長さにする方法はありません。長さを取得して後続の参照で使用するには、INDEX を使用して NUL 文字列の場所を調べます。

関連情報