STATIC

文と属性:副プログラム中の変数の記憶域割付けを制御します (AUTOMATIC として)。STATIC として宣言され,メモリーに割り当てられた変数は,スタック記憶領域ではなくスタティック記憶領域に置かれます。

STATIC 属性は,型宣言文か,STATIC 文で指定することができ,以下のいずれかの形式を取ります。

形式

型宣言文

type, [att-ls,] STATIC [,att-ls] :: v [,v]...

STATIC v [,v]...

type
データ型指定子。

att-ls
省略可能な属性指定子の並び。

v
変数または配列指定の名前。任意の型を持つことができます。

規則と振る舞い

STATIC 宣言は,記憶域にデータがどのように割り付けられるかという点にのみ影響を与えます。

副プログラムに再入したときに,変数の定義が残っているようにするには,SAVE 属性を使用する必要があります。

基本設定では,コンパイラは,割付け配列を除く非再帰的副プログラムの局所変数を,スタティック記憶域に割り付けます。変数がその使用前につねに定義されていることにコンパイラが気づいた場合,変数を一時的 (スタックまたはレジスタ) 記憶域に割り付けることがあります。SAVE 属性を適切に使用すれば,変数が定義前に使用されたときに生じるコンパイラの警告を防ぐことができます。

変数の基本設定を変更するには,変数を AUTOMATIC として指定するか,以下のいずれかの方法で RECURSIVE を指定します。

変数に影響を与える可能性のあるコンパイラ・オプションを無効にするには,変数を明示的に STATIC として指定します。


注意:データとして初期化された変数と,COMMON および SAVE 文に含まれる変数は,つねにスタティックです。これはコンパイラ・オプションが再帰を指定しているかどうかとは関係ありません。

同じ有効域で,1 つの変数を 2 度以上 STATIC として指定することはできません。

変数がポインタである場合,STATIC はポインタそのものにのみ適用され,結合されている指示先には適用されません。

一部の変数は STATIC として指定できません。次の表にこれらの制約を示します。

変数 STATIC
仮引数 いいえ
自動割付けオブジェクト いいえ
共通ブロック項目 はい
参照結合項目 いいえ
関数結果 いいえ
構造型の成分 いいえ

変数に対しては,STATIC 属性と SAVE 属性の両方を指定することができます。

変数がモジュールの有効範囲外にある場合,STATIC としては指定できます。

互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

AUTOMATICOPTIONSPOINTERRECURSIVE/recursiveSAVE型宣言文属性の互換性モジュールとモジュール手続

以下の例は,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