ATTRIBUTES プロパティ (またはオプション) の C,STDCALL,REFERENCE,VALUE,および VARYING は,いずれもルーチンの呼び出し規約に影響を与えます。これらのプロパティは,次のように指定することができます。
ルーチン全体に対しては,C,STDCALL,REFERENCE,および VARYING 属性を指定することができます。
個々の引数に対しては,REFERENCE および VALUE 属性を指定することができます。
基本設定では,Fortran はすべてのデータを参照で渡します。ただし,例外として,文字列の隠された文字長引数は値で渡されます。C または STDCALL オプションが使用されると,基本設定は配列以外のほぼすべてのデータを値で渡すように変更されます。ただし,呼び出し規約オプションの C と STDCALL に加えて,引数オプションの VALUE と REFERENCE を指定することで,呼び出し規約オプションとは無関係に,引数を値または参照で渡すことができます。配列は参照でしか渡せません。
個々の Fortran 手続を特定の属性を持つように宣言することで,複数の Fortran 呼び出し規約を指定することができます。次に ia32 システムでの例を示します。
INTERFACE SUBROUTINE MY_SUB (I) !DEC$ ATTRIBUTES C, ALIAS:’_My_Sub’:: MY_SUB ! ia32 システム INTEGER I END SUBROUTINE MY_SUBEND INTERFACE
このコードは,(ia32 システムで) MY_SUB という名前のサブルーチンが C プロパティを持つものとして,また外部名 _My_Sub が ALIAS プロパティを持つものとして宣言しています。
ia64 システムでは,MY_SUB のように,外部名の先頭に下線は付かないので,ATTRIBUTES 行の正しい形は次のようになります。
!DEC$ ATTRIBUTES C, ALIAS:’My_Sub’:: MY_SUB ! ia64 システム
ia32 と ia64 の両方のプラットフォームを対象としたコードを作成するには,既定のプリプロセッサー・マクロ _M_IX86_ と _M_IA64_ (「/define」に説明があります) を使って,IF 指示文構文の条件コンパイル機能を使用します。
次表に,一般的な Fortran 呼び出し規約命令の効果を要約します。
ATTRIBUTES オプションの呼び出し規約
基本設定 | C | STDCALL | C,REFERENCE | STDCALL,REFERENCE | |
引数 | |||||
スカラ | 参照 | 値 | 値 | 参照 | 参照 |
スカラ [値] | 値 | 値 | 値 | 値 | 値 |
スカラ [参照] | 参照 | 参照 | 参照 | 参照 | 参照 |
文字列 | 参照 Len: Mixed または Len: End |
文字列 (1:1) | 文字列 (1:1) | 参照 Len: Mixed または Len: End |
参照 Len: Mixed または Len: End |
文字列 [値] | エラー | 文字列 (1:1) | 文字列 (1:1) | 文字列 (1:1) | 文字列 (1:1) |
文字列 [参照] | 参照 Len: Mixed または Len なし |
参照 Len なし |
参照 Len なし |
参照 Len なし |
参照 Len なし |
配列 | 参照 | 参照 | 参照 | 参照 | 参照 |
配列 [値] | エラー | エラー | エラー | エラー | エラー |
配列 [参照] | 参照 | 参照 | 参照 | 参照 | 参照 |
構造型 | 参照 | 値 大きさに依存 |
値 大きさに依存 |
参照 | 参照 |
構造型 [値] | 値 大きさに依存 |
値 大きさに依存 |
値 大きさに依存 |
値 大きさに依存 |
値 大きさに依存 |
構造型 [参照] | 参照 | 参照 | 参照 | 参照 | 参照 |
F90 ポインタ | 記述子 | 記述子 | 記述子 | 記述子 | 記述子 |
F90 ポインタ [値] | エラー | エラー | エラー | エラー | エラー |
F90 ポインタ [参照] | 記述子 | 記述子 | 記述子 | 記述子 | 記述子 |
手続名 | |||||
接尾辞 | @n (ia32 システム) | なし | @n (ia32 システム) | なし | @n (ia32 システム) |
大文字と小文字 | 大文字 | 小文字 | 小文字 | 小文字 | 小文字 |
スタックのクリーンアップ | 呼び出される側 | 呼び出す側 | 呼び出される側 | 呼び出す側 | 呼び出される側 |
この表の用語は次の意味を持っています。
[値] | VALUE 属性が割り当てられた引数。 |
[参照] | REFERENCE 属性が割り当てられた引数。 |
値 | 引数の値はスタックにプッシュされます。すべての値が次の 4 バイト境界まで充填されます。 |
参照 | ia32 システムでは,4 バイトの引数アドレスがスタックにプッシュされます。 ia64 システムでは,8 バイトの引数アドレスがスタックにプッシュされます。 |
Len: Mixed または Len: End | 特定の文字引数について次の意味を持ちます。
|
Len: Mixed または Len なし | 特定の文字引数について,次の意味を持ちます。
|
Len なし | 文字引数で呼び出された手続からは文字列長がわかりません。 |
文字列 (1:1) | 文字引数で,最初の文字が ICHAR(string(1:1)) のように INTEGER(4) に変換され,スタックに値でプッシュされます。 |
エラー | コンパイラ・エラーを生成します。 |
記述子 | ia32 システムでは,配列記述子の 4 バイト・アドレスです。 ia64 システムでは,配列記述子の 8 バイト・アドレスです。 |
@n | ia32 システムでは,アットマーク (@) の後に,引数並びに必要なバイト数 (10進) を続けます。 |
大きさに依存 | ia32 システムでは,値で指定される構造型引数は,次のように渡されます。
|
大文字 | 手続名はすべて大文字です。 |
小文字 | 手続名はすべて小文字です。 |
呼び出される側 | 呼び出された手続が,呼び出し側に返る前に,スタックから引数を除去する責任を負います。 |
呼び出す側 | 呼び出しを行った手続が,呼び出しの完了後に,スタックから引数を除去する責任を負います。 |
次表に,Visual Fortran の ATTRIBUTES オプションと,他の言語の呼び出し規約の対応関係を示します。
呼び出し規約の対応関係
他の言語の呼び出し規約 | 対応する ATTRIBUTES オプション |
Visual C/C++ の cdecl (基本設定) | C |
Visual C/C++ の __stdcall | STDCALL |
Visual Basic | なし |
Visual Basic の CDECL キーワード | C |
MASM の C (PROTO および PROC 宣言での) | C |
MASM の STDCALL (PROTO および PROC 宣言での) | STDCALL |
ALIAS オプションは,他の任意の Fortran 呼び出し規約オプションと組み合わせることで,名前に含まれる大文字小文字の違いを保つことができます。