C言語

【C言語】静的変数

この記事では、C言語の静的変数(スタティック変数)について解説します。

通常、関数内で宣言された変数は、その関数が終了したら消えてしまいますが、静的変数として宣言しておくことで関数が終了しても消滅せず、プログラム終了まで保持されます。

それでは、静的変数の使い方を見ていきましょう!

静的変数の使い方

静的変数は、変数宣言時に static を付けて宣言します。

static データ型 変数名;

もちろん、初期値を渡すこともできます。

static データ型 変数名 = 初期値;
  • 初期値を指定しなかった場合、0 で初期化される
  • 関数が何度呼び出されても初期化されるのは最初だけ

サンプル

適当な関数内で静的変数を宣言し、呼び出されるたびに値を加えてみます。

#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 を付けておきましょう!

C言語おすすめ参考書
MMGames (著), 秀和システム(出版)
中山 清喬 (著), 株式会社フレアリンク (著)