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

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

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

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

また、オペレーティング・システムやアーキテクチャーとは関係なく、適切な名前の修飾を持たせるために、DECORATE オプションと ALIAS オプションを組み合わせることを推奨します。DECORATE オプションは、ALIAS で指定される外部名が、実際の呼び出しメカニズムに対応する適切なプリフィックスとポストフィックスの修飾を持たなければならないことを示します。

命名規則は次のとおりです。

次に例を示します。

   INTERFACE
      SUBROUTINE MY_SUB (I)
          !DEC$ ATTRIBUTES C, DECORATE, ALIAS:'My_Sub'
 :: MY_SUB 
          INTEGER I
      END SUBROUTINE MY_SUB
   END INTERFACE

このコードは、MY_SUB という名前のサブルーチンを C プロパティーで宣言します。また、外部名は、オペレーティング・システムおよびプラットフォームの規則に基づいて修飾されます。

Fortran の一般的な呼び出し規則宣言子の効果を以下の表に要約します。

ATTRIBUTES オプションの呼び出し規則

引数

デフォルト

C

C、REFERENCE

STDCALL

(IA-32 アーキテクチャー・ベースの Windows システム)

STDCALL、REFERENCE

(IA-32 アーキテクチャー・ベースの Windows システム)

スカラー

参照

参照

参照

スカラー [値]

スカラー [参照]

参照

参照

参照

参照

参照

文字列

参照 (Len:End または Len:Mixed)

文字列 (1:1)

参照 (Len:End または Len:Mixed)

文字列 (1:1)

文字列 (1:1)

文字列 [値]

エラー

文字列 (1:1)

文字列 (1:1)

文字列 (1:1)

文字列 (1:1)

文字列 [参照]

参照 (No Len または Len:Mixed)

参照 (No Len)

参照 (No Len)

参照 (No Len)

参照 (No Len)

配列

参照

参照

参照

参照

参照

配列 [値]

エラー

エラー

エラー

エラー

エラー

配列 [参照]

参照

参照

参照

参照

参照

派生型

参照

値 (サイズに依存)

参照

値 (サイズに依存)

参照

派生型 [値]

値 (サイズに依存)

値 (サイズに依存)

値 (サイズに依存)

値 (サイズに依存)

値 (サイズに依存)

派生型 [参照]

参照

参照

参照

参照

参照

F90 ポインター

記述子

記述子

記述子

記述子

記述子

F90 ポインター [値]

エラー

エラー

エラー

エラー

エラー

F90 ポインター [参照]

記述子

記述子

記述子

記述子

記述子

命名規則

プリフィックス

_ (IA-32 アーキテクチャー・ベースの Windows システム、すべての Mac OS X システム)

none (その他のシステム)

_ (IA-32 アーキテクチャー・ベースの Windows システム、すべての Mac OS X システム)

none (その他のシステム)

_ (IA-32 アーキテクチャー・ベースの Windows システム、すべての Mac OS X システム)

none (その他のシステム)

_

_

サフィックス

none (Windows)

_ (Linux、Mac OS X)

none

none

@n

@n

大文字・小文字

大文字

小文字

小文字

小文字

小文字

スタック・クリーンアップ

呼び出し元

呼び出し元

呼び出し元

呼び出し先

呼び出し先

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

[値]

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

[参照]

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

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

参照

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

インテル® 64 および IA-64 アーキテクチャー・ベースのシステムでは、8 バイトの引数アドレスがスタックにプッシュされます。

Len:End または Len:Mixed

特定の文字列引数についての意味は次のとおりです。

  • Len:End は、-nomixed-str-len-arg (Linux および Mac OS X) または /iface:nomixed_str_len_arg (Windows) が設定されている場合に適用されます。ほかのすべての引数の後に、文字長がスタックに (値で) プッシュされます。これはデフォルトの値です。

  • Len:Mixed は、-mixed-str-len-arg (Linux および Mac OS X) または /iface:mixed_str_len_arg (Windows) が設定されている場合に適用されます。文字列の先頭アドレスの直後に、文字長がスタックに (値で) プッシュされます。

No Len または Len:Mixed

特定の文字列引数についての意味は次のとおりです。

  • No Len は、nomixed-str-len-arg (Linux および Mac OS X) または /iface:nomixed_str_len_arg (Windows) が設定されている場合に適用されます。呼び出されたプロシージャーからは文字長がわかりません。これはデフォルトの値です。

  • Len:Mixed は、mixed-str-len-arg (Linux および Mac OS X) または /iface:mixed_str_len_arg (Windows) が設定されている場合に適用されます。文字列の先頭アドレスの直後に、文字長がスタックに (値で) プッシュされます。

No Len

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

文字列 (1:1)

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

エラー

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

記述子

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

インテル® 64 および IA-64 アーキテクチャー・ベースのシステムでは、配列記述子の 8 バイト・アドレスです。

@n

IA-32 アーキテクチャー・ベースのシステムでは、引数リストに必要なバイト数 (10 進法) の前にアットマーク (@) が追加されます。

サイズに依存

IA-32 アーキテクチャー・ベースのシステムでは、値で指定される派生型引数は次のように渡されます。

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

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

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

大文字

プロシージャー名がすべて大文字になります。

小文字

プロシージャー名がすべて小文字になります。

呼び出し先

呼び出されたプロシージャーが、呼び出し元に返る前に、スタックから引数を削除しなければなりません。

呼び出し元

呼び出しを行ったプロシージャーが、呼び出しの完了後に、スタックから引数を削除しなければなりません。

下の表に、他言語の呼び出し規則に対応する ATTRIBUTES オプションを示します。

対応する呼び出し規則

他言語の呼び出し規則

対応する ATTRIBUTES オプション

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

C

C/C++ __stdcall (Windows のみ)

STDCALL

MASM C (PROTO 宣言および PROC 宣言) (Windows のみ)

C

MASM STDCALL (PROTO 宣言および PROC 宣言) (Windows のみ)

STDCALL

アセンブリー (Linux のみ)

C

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

Windows システムでは、コンパイラー・オプションの /iface を使用することで、デフォルトの引数渡し規則を設定できます。/iface には、次のオプションがあります。

オプション

引数を渡す方法

IA-32 アーキテクチャー・ベースのシステム上で @n を名前に追加する

スタックのクリーンアップ

Varargs のサポート

/iface:cref

参照渡し

X

呼び出し元

/iface:stdref

参照渡し

呼び出し先

X

/iface:default

参照渡し

X

呼び出し元

/iface:c

値渡し

X

呼び出し元

/iface:stdcall

値渡し

呼び出し先

X

/iface:cvf

参照渡し

呼び出し先

X