インテル® Fortran コンパイラー 16.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) language-binding-spec 属性を持つプロシージャーでは、ATTRIBUTES STDCALL を指定することができます。そうすることで、IA-32 アーキテクチャー・ベースの Windows* システムの場合に限り、呼び出し規約が 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 文字列の場所を調べます。