通用範囲 | 記憶領域 |
---|---|
グローバル変数 | 静的領域 |
[ 1 ] 外部変数を宣言すると、同一ソースファイルの宣言した行以降で自由に参照できます。
[ 2 ] ソースの中程で外部変数を宣言した場合、宣言した行以降は自由に参照できますが、宣言よりも前で参照する場合は extern 宣言が必要です。
[ 3 ] 複数のソースファイルに分割してプログラムを作成する場合、宣言を含まないファイルで参照する時には extern 宣言が必要です。
ソースファイルB の例のようにファイルの先頭で外部変数的に extern すると、それ以降のすべての関数から max が参照できることになります。これは便利な反面、max がどこで使われているかを把握しづらくなりバグの原因になりやすくなります。
[ 4 ] 外部変数を別のファイル内で宣言しておき、参照する関数ごとに extern するのが一番よいスタイルです。そうすれば、extern を行った関数内だけで max が参照できるようになり他の関数からは参照できません。
通用範囲 | 記憶領域 |
---|---|
グローバル変数 ローカル変数 | 静的領域 |
5.記憶クラスによる初期化の違い
記憶クラス | 記憶領域 | 初期化のされ方 | 初期化をしなかった場合 |
---|---|---|---|
自動変数 レジスタ変数 | 動的領域 | 実行時に関数の呼び出しごと | 不定 |
外部変数 静的変数 | 静的領域 | コンパイル時に一度だけ | 自動的に0に初期化 |
6.記憶クラスの上手な使い分け
const double pai = 3.14; /* πを宣言 */
void func (void) {
pai = 5.0; /* コンパイル時にエラーとなる */
}
配列を使うとき、サイズが大きい場合で一度だけ初期化すれば良いような場合は静的変数で確保すると良いでしょう。初期化にかかる時間が短縮されて実行速度が向上します。
[ 例 ] 静的な場合と動的な場合の初期化速度の差の例 ex8-2.c
結果例 動的 = 2.69秒 静的 = 1.65秒