インテル® Fortran コンパイラー 14.0 ユーザー・リファレンス・ガイド
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)
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) を指定すると、次のようになります。
C コンパイラーが使用する Fortran 名を含む外部名が小文字に変換されます (NAME= が指定された場合を除く)。
引数が参照で渡され、参照で受け取ります (引数に VALUE 属性が指定されている場合を除く)。
互換性のある引数のみ使用できます。
隠れ引数は使用できません。
関数型は互換性がなければならず、関数値は 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 文字列の場所を調べます。