文と属性:副プログラム中の変数の記憶域割付けを制御します (AUTOMATIC として)。STATIC として宣言され,メモリーに割り当てられた変数は,スタック記憶領域ではなくスタティック記憶領域に置かれます。
STATIC 属性は,型宣言文か,STATIC 文で指定することができ,以下のいずれかの形式を取ります。
形式
型宣言文
type, [att-ls,] STATIC [,att-ls] :: v [,v]...
文
STATIC v [,v]...
type
データ型指定子。
att-ls
省略可能な属性指定子の並び。
v
変数または配列指定の名前。任意の型を持つことができます。
規則と振る舞い
STATIC 宣言は,記憶域にデータがどのように割り付けられるかという点にのみ影響を与えます。
副プログラムに再入したときに,変数の定義が残っているようにするには,SAVE 属性を使用する必要があります。
基本設定では,コンパイラは,割付け配列を除く非再帰的副プログラムの局所変数を,スタティック記憶域に割り付けます。変数がその使用前につねに定義されていることにコンパイラが気づいた場合,変数を一時的 (スタックまたはレジスタ) 記憶域に割り付けることがあります。SAVE 属性を適切に使用すれば,変数が定義前に使用されたときに生じるコンパイラの警告を防ぐことができます。
変数の基本設定を変更するには,変数を AUTOMATIC として指定するか,以下のいずれかの方法で RECURSIVE を指定します。
FUNCTION または SUBROUTINE 文の中のキーワードとして
コンパイラ・オプションとして
OPTIONS 文中のオプションとして
変数に影響を与える可能性のあるコンパイラ・オプションを無効にするには,変数を明示的に STATIC として指定します。
同じ有効域で,1 つの変数を 2 度以上 STATIC として指定することはできません。
変数がポインタである場合,STATIC はポインタそのものにのみ適用され,結合されている指示先には適用されません。
一部の変数は STATIC として指定できません。次の表にこれらの制約を示します。
変数 | STATIC |
---|---|
仮引数 | いいえ |
自動割付けオブジェクト | いいえ |
共通ブロック項目 | はい |
参照結合項目 | いいえ |
関数結果 | いいえ |
構造型の成分 | いいえ |
変数に対しては,STATIC 属性と SAVE 属性の両方を指定することができます。
変数がモジュールの有効範囲外にある場合,STATIC としては指定できます。
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
AUTOMATIC,OPTIONS,POINTER,RECURSIVE,/recursive,SAVE,型宣言文,属性の互換性,モジュールとモジュール手続
例
以下の例は,STATIC 属性を指定する型宣言文を示しています。
INTEGER, STATIC :: ARRAY_A
次の例は,STATIC 文を示しています。
... CONTAINS INTEGER FUNCTION REDO_FUNC INTEGER I, J(10), K REAL C, D, E(30) STATIC I, J, K(20) STATIC C, D, E ... END FUNCTION ...
INTEGER N1, N2 N1 = -1 DO WHILE (N1) N2 = N1*2 call sub1(N1, N2) read *, N1 END DO CONTAINS SUBROUTINE sub1 (iold, inew) INTEGER, intent(INOUT):: iold integer, STATIC ::N3 integer, intent(IN) :: inew if (iold .eq. -1) then N3 = iold end if print *, 'New: ', inew, 'N3: ',N3 END subroutine ! END