ATTRIBUTES プロパティと呼び出し規則

ATTRIBUTES プロパティ (またはオプション) の C、REFERENCE、VALUE、および VARYING は、いずれもルーチンの呼び出し規則に影響を与えます。これらのプロパティは,次のように指定することができます:

デフォルトでは、Fortran はすべてのデータを参照で渡します (ただし、例外として文字列の隠された文字長引数は値で渡されます)。C プロパティが使用された場合は、配列以外のほとんどすべてのデータを値で渡すようにデフォルト設定が変更されます。また、呼び出し規則の C プロパティ以外にも、引数プロパティの VALUE および REFERENCE を指定することで、呼び出し規則のプロパティとは無関係に、引数を値または参照で渡すことができます。配列は参照でしか渡せません。

Fortran プロシージャを特定の属性を持つように宣言することにより、複数の呼び出し規則を指定できます。次に例を示します:

INTERFACE
SUBROUTINE MY_SUB (I)
    !DEC$ ATTRIBUTES C, ALIAS:'My_Sub_' :: MY_SUB !ia32 systems
    INTEGER I   END SUBROUTINE MY_SUB
END INTERFACE

このコードでは、MY_SUB という名前のサブルーチンが C プロパティで宣言され、また、外部名 My_Sub_ が ALIAS プロパティで設定され宣言されています。

次の例では、サブルーチンが C の呼び出し規則で呼び出されるように宣言されています:

SUBROUTINE CALLED_FROM_C (A)
  !DEC$ ATTRIBUTES C :: CALLED_FROM_C
  INTEGER A

Fortran の一般的な呼び出し規則ディレクティブの効果を以下の表に要約します:

ATTRIBUTES プロパティの呼び出し規則

引数

デフォルト

C

C, REFERENCE

スカラ

参照

参照

スカラ [値]

スカラ [参照]

参照

参照

参照

文字列

参照
Len:End または Len:Mixed

文字列(1:1)

参照
Len:End または Len:Mixed

文字列 [値]

エラー

文字列(1:1)

文字列(1:1)

文字列 [参照]

参照
No Len または Len:Mixed

参照
No Len

参照
No Len

配列

参照

参照

参照

配列 [値]

エラー

エラー

エラー

配列 [参照]

参照

参照

参照

派生型

参照


サイズに依存

参照

派生型 [値]


サイズに依存


サイズに依存


サイズに依存

派生型 [参照]

参照

参照

参照

F90 ポインタ

記述子

記述子

記述子

F90 ポインタ [値]

エラー

エラー

エラー

F90 ポインタ [参照]

記述子

記述子

記述子

すべての呼び出し規則ではプロシージャ名が小文字になります。

上の表で使用されている用語の意味は以下のとおりです:

[値]

VALUE 属性が割り当てられた引数。

[参照]

REFERENCE 属性が割り当てられた引数。

引数の値がスタックにプッシュされます。すべての値が次の 4 バイト境界までパディングされます。

参照

IA-32 システムでは、4 バイトの引数アドレスがスタックにプッシュされます。
Itanium® ベース・システムでは、8 バイトの引数アドレスがスタックにプッシュされます。

Len:End または Len:Mixed

特定の文字列引数について次の意味を持ちます:

  • Len:End は、-nomixed_str_len_arg が設定されている場合に適用されます。他のすべての引数の後に、文字列長がスタックに (値で) プッシュされます。これはデフォルトで使用されます。

  • Len:Mixed は、-mixed_str_len_arg が設定されている場合に適用されます。文字列の先頭アドレスの直後に、文字列長がスタックに (値で) プッシュされます。

No Len または Len:Mixed

特定の文字列引数について次の意味を持ちます:

  • No Len は、-nomixed_str_len_arg が設定されている場合に適用されます。呼び出されたプロシージャからは文字列長がわかりません。これはデフォルトで使用されます。

  • Len:Mixed は、-mixed_str_len_arg が設定されている場合に適用されます。文字列の先頭アドレスの直後に、文字列長がスタックに (値で) プッシュされます。

No Len

文字列引数において、呼び出されたプロシージャからは文字列長がわかりません。

文字列(1:1)

文字列引数において、最初の文字が ICHAR(string(1:1)) のように INTEGER(4) に変換され、スタックに値でプッシュされます。

エラー

コンパイラ・エラーを生成します。

記述子

IA-32 システムでは、配列記述子の 4 バイト・アドレスです。
Itanium ベース・システムでは、配列記述子の 8 バイト・アドレスです。

サイズに依存

IA-32 システムでは、値で指定される派生型引数は次のように渡されます:

  • 1〜4 バイトの引数は値で渡されます。

  • 5〜8 バイトの引数は、2 つのレジスタ (2 つの引数) を使用して値で渡されます。

  • 8 バイト以上の引数は一時的な記憶アドレスを値で渡すことにより、値のセマンティックスを提供します。

下の表に、他言語の呼び出し規則と一致する他の ATTRIBUTES プロパティを示します:

他言語の呼び出し規則

一致する ATTRIBUTES プロパティ

C/C++ cdecl (デフォルト)

C

ALIAS プロパティを他の任意の Fortran 呼び出し規則プロパティとともに使用することで、名前に含まれる大文字・小文字をそのまま維持できます。また、DECORATE プロパティを ALIAS プロパティと組み合わせることにより、実際に呼び出しメカニズムと関係付けるために、ALIAS で使用される外部名にプリフィックスとポストフィックスの修飾を持たせるように指定できます。