C言語 static 静的関数の使い方

関数にstaticを付けるとその関数は、
記述されたファイル内でのみ使える関数となります。

static付き関数の基本的な書き方

main1.c

#include <stdio.h>

static void show(void);
void main2(void);
 
void main(void) {
    show();
    main2();
}

 static void show(void) {
    printf("show\n");
}

main2.c

void main2(void);
void show(void);

void main2(void) {
    show();      // show関数を呼び出せない
}

main関数からshow関数の呼び出しは何の問題もありません。

しかし、次のmain2関数呼び出しで、
処理がmain2.cファイルに移ります。

そこでshow関数を呼び出そうとすると・・・できません。
これがstaticの効果です。

外部のファイルからはshow関数は存在しない(見えない)のです。

もっとも、上記のプログラムは
コンパイル時にエラーとなり、実行できません。

別ファイルでは同じ関数名を使う事ができる

static付き関数は、上記で説明したように
別のファイルからは見えません。

なので、static付き関数と同じ関数名を使用しても何の問題もありません。

記述例

main1.c

#include <stdio.h>

static void show(void);
void main2(void);

void main(void) {
    show();
    main2();
    show();
}

static void show(void) {
    printf("main1.cのshow関数が呼ばれました\n");
}

main2.c

void main2(void);
void show(void);

void main2(void) {
    show();
}

void show(void) {
    printf("main2.cのshow関数が呼ばれました\n");
}

上記のプログラムを実行したら
結果はどうなるでしょうか?

main1.cのshow関数が呼ばれました
main2.cのshow関数が呼ばれました
main1.cのshow関数が呼ばれました

結果は上記のように出力されました。

スポンサーリンク

static付き関数の使いどころは?

static付き関数は、例えば複数人での開発となった場合に、
個人個人でそれぞれ異なった関数名や(グローバル)変数名を
付けると思いますが、万が一、他人とかぶってしまう場合があり、
プログラムを結合する時に問題になります。

そういう時に、static付き関数と
static付きグローバル変数などを使って
限られた範囲内で開発してもらうようにすると、うまくいきます。