この記事では、C言語の静的変数(スタティック変数)について解説します。
通常、関数内で宣言された変数は、その関数が終了したら消えてしまいますが、静的変数として宣言しておくことで関数が終了しても消滅せず、プログラム終了まで保持されます。
それでは、静的変数の使い方を見ていきましょう!
静的変数は、変数宣言時に static
を付けて宣言します。
static データ型 変数名;
もちろん、初期値を渡すこともできます。
static データ型 変数名 = 初期値;
サンプル
適当な関数内で静的変数を宣言し、呼び出されるたびに値を加えてみます。
#include <stdio.h>
// 引数で受け取った値を 静的変数result に加える関数
int sum(int num) {
// 静的変数の宣言
static int result;
return result += num;
}
int main() {
printf("2 足す: %d\n", sum(2));
printf("5 足す: %d\n", sum(5));
printf("8 足す: %d\n", sum(8));
}
実行結果
2 足す: 2
5 足す: 7
8 足す: 15
何度関数を呼び出しても静的変数が初期化されなかったので、今までの合計値を得ることができました!
グローバル変数、または 関数に static
を付けることで、他のファイルからアクセス不能にすることができる。
グローバルな静的変数は、関数外で静的変数を宣言するだけです。
// 関数外で宣言
static データ型 変数名;
スタティック関数は、通常の関数の定義に static
を付けるだけです。
static 型名 関数名(型名 引数名) {
// なんらかの処理
}
サンプル
適当なファイルを作成し、その中でスタティック関数を定義してみます。
test.c
#include <stdio.h>
static void func(){
printf("func関数\n");
}
ヘッダファイルを作成します。
test.h
void func();
作成したファイルを main から呼び出してみます。
main.c
#include <stdio.h>
#include "test.h" // インクルード
int main() {
// test.c の関数を呼び出す
func();
}
コンパイルするとエラーが発生します。
ターミナルやコマンドプロンプト
% gcc main.c test.c -o main
Undefined symbols for architecture x86_64:
"_func", referenced from:
_main in main-75c196.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
test.c で定義した func関数 の static を削除してコンパイルしてみてください。正常にコンパイルできたかと思います。
このように、グローバル変数や関数に static を付けることで他のファイルから呼び出し不能にすることができます。外部から呼び出す必要がない、または呼び出して欲しくない関数や変数には static を付けておきましょう!