変数に static指定子を付ける事で、その変数は静的変数となります。
静的ローカル変数
通常のローカル変数は、その関数から抜けると全て失われてしまいますが、
static 付きの静的変数とすれば、関数から抜けても値が保持されます。
また、この変数は、プログラムが終了するまで保持されます。
#include <stdio.h>
void show(void);
void main(void) {
show();
show();
show();
}
void show(void) {
static int count=0;
count++;
printf("%d\n", count);
}
このプログラムでは、関数 show 内で静的変数 count が使用されています。
1回目のshow関数呼び出しで静的変数 count の初期化が行われ、
countが1ずつ増えます。
2回目以降のshow関数呼び出しでは、count の初期化は行いませんが、
前回のcountの値が保持されています。
出力は、1 2 3 となります。
静的グローバル変数
通常のグローバル変数は、どこからでも使用する事ができますが、
static 付きの静的変数とすれば、そのファイル内からのみ使用できます。
つまり、別ファイルからは使用できません。(externを使用してもダメ)
この変数もローカル変数と同様に、 プログラムが終了するまで保持されます。
program1.c
#include <stdio.h>
void show(void);
// 静的グローバル変数(定義・実体)
static int idata;
void main(void) {
show();
}
program2.c
#include <stdio.h>
void show(void);
// グローバル変数(宣言・参照)
extern int idata;
void show(void) {
idata = 10; // エラーとなる。
printf("%d\n", idata); // エラーとなる。
}