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

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

基本設定では,Fortran はすべてのデータを参照で渡します。ただし,例外として,文字列の隠された文字長引数は値で渡されます。C または STDCALL オプションが使用されると,基本設定は配列以外のほぼすべてのデータを値で渡すように変更されます。ただし,呼び出し規約オプションの CSTDCALL に加えて,引数オプションの VALUEREFERENCE を指定することで,呼び出し規約オプションとは無関係に,引数を値または参照で渡すことができます。配列は参照でしか渡せません。

個々の 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_SubALIAS プロパティを持つものとして宣言しています。

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 CREFERENCE STDCALLREFERENCE
引数
スカラ 参照 参照 参照
スカラ [値]
スカラ [参照] 参照 参照 参照 参照 参照
文字列 参照
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 は,/iface:mixed_str_len_arg が設定されているときに適用されます。文字列の先頭アドレスの直後に,文字列長がスタックに (値で) プッシュされます。

  • Len: End は,/iface:nomixed_str_len_arg が設定されているときに適用されます。他の全引数の後に,文字列長がスタックに (値で) プッシュされます。

Len: Mixed または Len なし 特定の文字引数について,次の意味を持ちます。

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

  • Len なしは,/iface:nomixed_str_len_arg が設定されているときに適用されます。呼び出された手続からは文字列長がわかりません。

Len なし 文字引数で呼び出された手続からは文字列長がわかりません。
文字列 (1:1) 文字引数で,最初の文字が ICHAR(string(1:1)) のように INTEGER(4) に変換され,スタックに値でプッシュされます。
エラー コンパイラ・エラーを生成します。
記述子 ia32 システムでは,配列記述子の 4 バイト・アドレスです。
ia64 システムでは,配列記述子の 8 バイト・アドレスです。
@n ia32 システムでは,アットマーク (@) の後に,引数並びに必要なバイト数 (10進) を続けます。
大きさに依存 ia32 システムでは,値で指定される構造型引数は,次のように渡されます。

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

  • 5 ~8 バイトの引数は 2 つのレジスタにあります (2 つの引数)。

  • 8 バイトよりも大きい引数は,一時的な記憶アドレスを参照で渡すことで,値のセマンティクスを提供します。

大文字 手続名はすべて大文字です。
小文字 手続名はすべて小文字です。
呼び出される側 呼び出された手続が,呼び出し側に返る前に,スタックから引数を除去する責任を負います。
呼び出す側 呼び出しを行った手続が,呼び出しの完了後に,スタックから引数を除去する責任を負います。

次表に,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 呼び出し規約オプションと組み合わせることで,名前に含まれる大文字小文字の違いを保つことができます。


注意:Windows グラフィカル・ユーザー・インタフェースを使用したり,API 呼び出しを行うときには,一般に STDCALL を使用します。Windows プログラミングについての詳細は,「Windows アプリケーションの作成」を参照してください。