一般コンパイラ指示文:指定した変数のプロパティを宣言します。
形式
cDEC$ ATTRIBUTES att [, att] ... :: object [, object] ...
c
次のいずれか:C (または c),!,* (「一般コンパイラ指示文の構文規則」を参照)
att
次のいずれか。
ADDRESS64 1 | DESCRIPTOR32 2 | REFERENCE |
ALIAS | DESCRIPTOR64 2 | REFERENCE32 2 |
ALLOW_NULL | DLLEXPORT | REFERENCE64 2 |
ARRAY_VISUALIZER | DLLIMPORT | STDCALL |
C | EXTERN | VALUE |
DECORATE | IGNORE_LOC | VARYING |
DEFAULT | NO_ARG_CHECK | |
DESCRIPTOR 2 | NOMIXED_STR_LEN_ARG | |
1 VMS と WNT
2 VMS のみ |
object
データ・オブジェクトまたは手続の名前。
次の表は,各種のオブジェクトでどのプロパティを使用できるかを示しています。
プロパティ | 変数と配列 の宣言 |
共通ブロック名 1 | 副プログラム宣言と EXTERNAL 文 |
---|---|---|---|
ADDRESS64 | はい | はい | いいえ |
ALIAS | いいえ | はい | はい |
ALLOW_NULL | はい | いいえ | いいえ |
ARRAY_VISUALIZER 2 | はい | いいえ | いいえ |
C | いいえ | はい | はい |
DECORATE | いいえ | いいえ | はい |
DEFAULT | いいえ | はい | はい |
DESCRIPTOR | はい 3 | いいえ | いいえ |
DESCRIPTOR32 | はい 3 | いいえ | いいえ |
DESCRIPTOR64 | はい 3 | いいえ | いいえ |
DLLEXPORT | はい 4 | はい | はい |
DLLIMPORT | はい | はい | はい |
EXTERN | はい | いいえ | いいえ |
IGNORE_LOC | はい 3 | いいえ | いいえ |
NO_ARG_CHECK | はい | いいえ | はい 5 |
NOMIXED_STR_LEN_ARG | いいえ | いいえ | はい |
REFERENCE | はい | いいえ | はい |
REFERENCE32 | はい | いいえ | いいえ |
REFERENCE64 | はい | いいえ | いいえ |
STDCALL | いいえ | はい | はい |
VALUE | はい | いいえ | いいえ |
VARYING | いいえ | いいえ | はい |
1 共通ブロック名は [/]common-block-name[/] として指定されます。
2 このプロパティは配列にのみ適用できます。 3 このプロパティはインタフェース宣言にのみ適用できます。 4 モジュール・レベルの変数と配列のみです。 5 このプロパティは EXTERNAL 文には適用できません。 |
これらのプロパティは,関数とサブルーチンの定義の中,型宣言の中,および INTERFACE 文と ENTRY 文で使用することができます。
参照結合または親子結合を通して利用可能な言語要素に適用されたプロパティは,結合中は有効です。たとえば,次の例を考えます。
MODULE MOD1 INTERFACE SUBROUTINE SUB1 !DEC$ ATTRIBUTES C, ALIAS:'othername' :: NEW_SUB END SUBROUTINE END INTERFACE CONTAINS SUBROUTINE SUB2 CALL NEW_SUB END SUBROUTINE END MODULE
この例では,SUB2 の中の NEW_SUB への呼び出しは,インタフェース宣言で指定されている C および ALIAS プロパティを使用します。
以下にこれらのプロパティについて説明します。
オブジェクトが 64 ビット・アドレスを持つことを指定します。このプロパティは,ALLOCATABLE および形状無指定配列を含む任意の変数または仮引数に対して指定することができます。ただし,このプロパティを持つ変数がデータを初期化することはできません。
これはまた共通ブロックに対して,または共通ブロック中の変数に対して指定することもできます。共通ブロック変数に対して指定した場合,共通ブロックは暗黙のうちに ADDRESS64 プロパティを持ちます。
ADDRESS64 には AUTOMATIC 属性との互換性はありません。
外部副プログラムを引用するときに使用される代替外部名を指定します。これは次の形式を取ります。
ALIAS:external-name
external-name
アポストロフィか引用符で区切られた文字定数。文字定数はそのままの形で使用されます。文字列は大文字に変換されず,空白が削除されることもありません。
ALIAS プロパティは C (および STDCALL) プロパティを無効にします。副プログラムに対して C と ALIAS の両方が指定された場合,副プログラムには C の呼び出し規約が与えられますが,C の名前付け規約は与えられません。その代わりに,ALIAS に対して指定された名前が変更なしに与えられます。
ALIAS は内部手続で使用することはできず,仮引数に適用することもできません。
以下の例は,サブルーチン happy にこの有効域外での名前 _OtherName@4 を与えています。
INTERFACE SUBROUTINE happy(i) !DEC$ ATTRIBUTES STDCALL, DECORATE, ALIAS:'OtherName' :: happy INTEGER i END SUBROUTINE END INTERFACE
cDEC$ ATTRIBUTES ALIAS は cDEC$ ALIAS 指示文と同じ効果を持ちます。
引数に対する値として NULL ポインタ (ゼロまたは NULL 組込み関数で定義) を対応する仮引数に渡せるようにします。
ALLOW_NULL は,REFERENCE プロパティもまた指定されている場合のみ有効で,そうでなければ,何の効果もありません。
Array Visualizer の性能を改善します。
割付け配列を Array Viewer で表示可能なように宣言するとき,このオプションは Array Viewer の性能を改善することができます。
real(4), allocatable :: MyArray(:, :) !DEC$ ATTRIBUTES array_visualizer :: MyArray
このオプションを使用すると,Array Viewer とアプリケーションの間で配列メモリーが共有されます。このオプションを使用しなければ,faglUpdate 呼び出しのたびに配列データがコピーされます。
このオプションは,配列が Array Visualizer 中で fagl* 呼び出しを使って表示されない限り効果を持ちません。
fagl* ルーチンの詳細については,Array Visualizer のオンライン・ドキュメントを参照してください。
C または機械語で書かれたルーチンを FORTRAN または Fortran 95/90 ルーチンで使用するときに,データをどのように渡すかを指定します。
ia32 プロセッサーでは,C と STDCALL は若干異なる意味を持ちます。他のすべてのプラットフォームでは,この 2 つは同義語として解釈されます。
副プログラムに適用されたとき,これらのプロパティは,副プログラムを特定の呼び出し規約の組を持つものとして定義します。
次の表に,各種の呼び出し規約の違いを要約します。
規約 | C 1 | STDCALL 1 | 基本 2 |
---|---|---|---|
引数は値によって渡される | はい | はい | いいえ |
外部副プログラム名の大文字小文字の区別 | VMS:大文字 U*X:小文字 WNT:小文字 W9*:小文字 |
VMS:大文字 U*X:小文字 WNT:小文字 W9*:小文字 |
VMS:大文字 U*X:小文字 WNT:大文字 W9*:大文字 |
U*X のみ | |||
末尾に下線が追加される | いいえ | いいえ | はい 3 |
WNT, W9* | |||
先頭に下線が追加される | はい | はい | はい |
引数の数が追加される | いいえ | はい | はい |
呼び出し側のスタック・クリーンアップ | はい | いいえ | いいえ |
可変個の引数 | はい | いいえ | いいえ |
1 C と STDCALL は,OpenVMS,Tru64 UNIX,および Linux システムでは同義語です。
2 Fortran 95/90 の呼び出し規約 3 Linux システムでは,外部名に複数個の下線がある場合,先頭に 2 つの下線が追加されます。下線がなければ,1 つの下線が追加されます。 |
副プログラムに対して C または STDCALL が指定された場合,(配列と文字列以外の) 引数は値によって渡されます。標準の Fortran 95/90 規約を使用する副プログラムは引数を引用によって渡します。
ia32 プロセッサーでは,副プログラムの外部名の先頭に下線 (_) が追加されます。STDCALL が指定された場合,名前の末尾にアットマーク (@) と,渡される引数のバイト数が追加されます。たとえば,3 つの INTEGER(4) 引数を持ち,STDCALL で定義された SUB1 という名前の副プログラムには,_sub1@12 という外部名が割り付けられます。
文字列引数は以下のように渡されます。
基本
OpenVMS,Tru64 UNIX,および Linux システムでは,引数並びの末尾に隠された長さが追加されます。
Windows システムでは,隠された長さは変数の直後に追加されます。/iface:nomixed_str_len_arg コンパイラ・オプションを指定すれば,OpenVMS,Tru64 UNIX,および Linux システムの動作をさせることができます。
C または STDCALL (のみ) が指定された場合
すべてのシステムで,文字列の最初の文字が渡されます (また,INTEGER(4) の長さまでゼロが充填されます)。
C または STDCALL が指定され,引数に対して REFERENCE が指定された場合
すべてのシステムで,文字列は長さなしで渡されます。
C または STDCALL が指定され,ルーチンに対して REFERENCE が指定された (ただし,引数に対しては REFERENCE が指定されていない) 場合
すべてのシステムで,文字列は長さ付きで渡されます。
詳細については,「REFERENCE」と「言語が混在したプログラミングにおける名付け規約の調整」参照してください。
cDEC$ ALIAS または cDEC$ ATTRIBUTES ALIAS で使用される外部名が結果として呼び出しメカニズムと関係付けられるように接頭辞と接尾辞の修飾を持たせるように指定します。これらは,ALIAS が指定されなかったときに手続名に適用される同じ修飾です。
ALIAS 外部名の場合は修正されません。
ALIAS が指定されなければ,このオプションは効果をもちません。
ATTRIBUTES オプション ALIAS の説明の例と ATTRIBUTES オプションの C と STDCALL の説明の接頭辞と接尾辞の修飾のまとめも参照してください。
外部ルーチンと共通ブロック宣言に影響を与える可能性がある一部のコンパイラ・オプションを無効にします。
これは,外部シンボルの名前付けと,ルーチンおよび共通ブロックの引数渡しの基本規約を変更するコンパイラ・オプション (/iface,/names,および /assume:underscore) を無視するようにコンパイラに指示します。
このオプションを STDCALL,C,REFERENCE,ALIAS などの他の cDEC$ ATTRIBUTES オプションと組み合わせることで,コンパイラの基本設定とは異なる属性を指定することができます。
このオプションは,コンパイラ・オプションが呼び出し規約や名前付け規約を変更するのを禁止するので,外部ルーチンのためのインタフェース宣言を宣言するときに便利です。
引数が VMS 記述子によって渡されることを指定します。このプロパティは,インタフェース宣言中の仮引数に対してしか指定できません (ルーチン名に対しては指定できません)。
引数が 32 ビット記述子として渡されることを指定します。
引数が 64 ビット記述子として渡されることを指定します。
ダイナミック・リンク・ライブラリー (DLL) を使用するプロセスに対して DLL インタフェースを定義します。これらのプロパティはデータ・オブジェクトまたは手続に割り付けることができます。
DLLEXPORT は,手続またはデータが他のアプリケーションまたは DLL にエクスポートされることを指定します。これにより,コンパイラは,シンボルをエクスポートするためのモジュール定義 (.def) ファイルが不要な効率的なコードを生成します。
手続 (またはデータ) が DLLEXPORT プロパティ付きで宣言される場合,同じプログラムの同じモジュール中で定義されなくてはなりません。
DLL 中で定義されているシンボルは,それらを使用するプログラムによってインポートされます。プログラムはインポート DLL にリンクし,シンボルをインポートするプログラム単位中で DLLIMPORT プロパティを使用する必要があります。インポートしようとしているシンボルを定義することは不可能なので,DLLIMPORT は定義ではなく宣言中で指定されます。
DLL の詳細については,「Fortran DLL の作成」を参照してください。
変数が別のソース・ファイルで割り付けられることを指定します。EXTERN は大域変数宣言で使用することができますが,仮引数には適用できません。
他の言語で宣言されている変数を参照するときには,必ず EXTERN を使用しなくてはなりません。
引数から %LOC を取り除くことを可能にします。
IGNORE_LOC はREFERENCE プロパティも指定されている場合に有効で,そうでなければ効果がありません。
明示的インタフェースに関連する型と形状の照合規則を無視することを指定します。これにより,任意の型または形状の引数を受け付ける外部手続やモジュール手続のための インタフェース宣言を作成することができます。このような手続の例としては,メモリー・コピー・ルーチンが考えられます。
NO_ARG_CHECK は,非総称手続またはモジュール手続用のインタフェース宣言でしか使用できません。個々の仮引数名に適用することも,ルーチン名に適用することもできますが,後者の場合,そのインタフェースに含まれるすべての仮引数にこのプロパティが適用されます。
NO_ARG_CHECK は,PURE または ELEMENTAL 接頭辞を持つ手続には使用できません。引数が INTENT または OPTIONAL 属性を持っている場合,NO_ARG_CHECK 指定はすべて無視されます。
隠された長さが引数並びの最後に連続した順番で置くことを指定します。これは,Tru64 UNIX システムでは基本設定として使用される方法です。
仮引数を渡す方法を指定します。
REFERENCE は,引数の値ではなく,仮引数のメモリー位置を渡すことを指定します。
VALUE は,引数のメモリー位置ではなく,仮引数の値を渡すことを指定します。
仮引数が VALUE プロパティを持っている場合,それに渡される実引数は別の型であってもかまいません。必要ならば,副プログラムが呼び出される前に型変換が行われます。
複素数 (KIND=4 または KIND=8) 引数が値によって渡される場合,2 つの浮動小数点引数 (実部を含むものが 1 つと虚部を含むものが 1 つ) が値によって渡されます。
文字値,部分文字列,大きさ引継ぎ配列,および整合配列は,値で渡すことはできません。
文字引数に対して REFERENCE (のみ) が指定されている場合,以下のようになります。
OpenVMS,Tru64 UNIX,および Linux システムでは,文字列は長さなしで渡されます。
Windows システムでは,変数の直後に隠された長さが渡されます。/iface:nomixed_str_len_arg コンパイラ・オプションを指定すれば,OpenVMS,Tru64 UNIX,および Linux の動作を得ることができます。
文字引数に対して REFERENCE が指定されており,ルーチンに対して C (または STDCALL) が指定されている場合,文字列は長さなしで渡されます。これは,ルーチンに対して REFERENCE が指定されている場合でも同じです。
ルーチンに対して REFERENCE と C (または STDCALL) が指定されているが,引数に対しては REFERENCE が指定されていない場合,文字列は長さ付きで渡されます。
副プログラム定義で C または STDCALL プロパティが指定されている場合の基本設定は VALUE です。
以下の例では,整数 x は値で渡されます。
SUBROUTINE Subr (x) INTEGER x !DEC$ ATTRIBUTES VALUE :: x
詳細については,「C と STDCALL」と「言語が混在したプログラミングにおける呼び出し規約の調整」を参照してください。
引数が 32 ビット・アドレスによってのみ受け付けられることを指定します。
引数が 64 ビット・アドレスによってのみ受け付けられることを指定します。
呼び出し時に可変個の引数を指定できるようにします。VARYING が指定される場合,C プロパティも指定されていなくてはなりません。
第 1 引数が,処理すべき引数の数を指定しているか,最後の引数が,それが最後の引数であることを示す特殊なマーカ (-1 など) であるかのどちらかが成り立っている必要があります。引数の並びと,それらの型と種類には,呼び出される手続と互換性がなくてはなりません。
オプション C,STDCALL,REFERENCE,VALUE,および VARYING は,ルーチンの呼び出し規約に影響します。これら cDEC$ ATTRIBUTES オプションを個別の引数やルーチン全体に対して指定することができます。
以下の形式も使うことができます。
!MS$ATTRIBUTES att [,att] ... :: object [,object] ...
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
Fortran DLL の作成,一般コンパイラ指示文,言語が混在したプログラミング
例
INTERFACE SUBROUTINE For_Sub (I) !DEC$ ATTRIBUTES C, ALIAS:'_For_Sub' :: For_Sub INTEGER I END SUBROUTINE For_Sub END INTERFACE
同じコンパイラ指示文で複数の変数に 1 つ以上のプロパティを割り当てることができます。すべてのプロパティは,すべての指定した変数に適用されます。以下に例を示します。
!DEC$ ATTRIBUTES REFERENCE, VARYING, C :: A, B, C
この場合,変数 A,B,および C は,REFERENCE,VARYING,および C プロパティに割り当てられます。プロパティと変数の数の唯一の制限は,コンパイラ指示文全体が 1 行に収まらなければならないことです。
プロパティに割り当てられた変数や手続の識別子は,簡単な名前でなければなりません。初期値指定や配列次元を含むことはできません。以下に無効な例を示します。
!DEC$ ATTRIBUTES C :: A(10) ! これは無効です。
以下に他の例を示します。
SUBROUTINE ARRAYTEST(arr) !DEC$ ATTRIBUTES DLLEXPORT :: ARRAYTEST REAL(4) arr(3, 7) INTEGER i, j DO i = 1, 3 DO j = 1, 7 arr (i, j) = 11.0 * i + j END DO END DO END SUBROUTINE