読者です 読者をやめる 読者になる 読者になる

プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

【C】 static関数の振る舞いについて

C言語では、staticキーワードを用いて、ある関数をそのファイル内部からだけ呼び出せるようにする、という説明と例を見ることがあります。

実は、関数ポインタを使った場合、外部ファイルからもstatic関数を呼び出して実行することが可能であることを知りましたので、まとめておきます。

 

サンプルプログラム

最初にサンプルプログラムを示しておきます。以下のように、main関数, sample関数(static関数), test2(sampleを外部から呼び出す関数)の3つの関数から構成しています。

(main.c)

main.c

(common.h)

common.h

(test2.h)

test2.h

(test2.c)

test2.c

これをコンパイルして、実行した結果が下記になります。

実行結果

正しく、main.c内で定義されているstatic関数が呼ばれているのが分かります。

 

思うところ

いままで、C言語のstatic関数は、その関数を含むファイルの内部(の関数)からしか呼べないとずっと思っていたのですが、関数ポインタにそのstatic関数のアドレスさえ渡すことができれば呼べるようです。

とはいうものの、static関数のプロトタイプ宣言は自由に実装ファイル以外に含めることができない(含めると『実装が無い』などのコンパイルエラーになります)ので、 externの関数(普通の関数)と同様に自由に呼び出せるという分けではないです。

使う場合は、参考サイトに記載されている例のように、static関数のアドレスを含む変数を取得する関数(こちらはexternの関数)を同じファイルに定義しておき、その関数経由でstatic関数を実行する、という使い方をするようです。

 

参考にしたサイト

『C言語関係掲示板』の『Cのリンケージについて』

『CとC++では扱いが異なるスコープとリンケージの関係を確かめる』

(次のサイトは使っている例が載っていました)

『selflearn @ ウィキ』 の『static関数を別ファイルの関数からコールする』

『プログラミングで応用力を付けようC 言語入門』の『52.まとめ』