C言語では、staticキーワードを用いて、ある関数をそのファイル内部からだけ呼び出せるようにする、という説明と例を見ることがあります。
実は、関数ポインタを使った場合、外部ファイルからもstatic関数を呼び出して実行することが可能であることを知りましたので、まとめておきます。
サンプルプログラム
最初にサンプルプログラムを示しておきます。以下のように、main関数, sample関数(static関数), test2(sampleを外部から呼び出す関数)の3つの関数から構成しています。
(main.c)
(common.h)
(test2.h)
(test2.c)
これをコンパイルして、実行した結果が下記になります。
正しく、main.c内で定義されているstatic関数が呼ばれているのが分かります。
思うところ
いままで、C言語のstatic関数は、その関数を含むファイルの内部(の関数)からしか呼べないとずっと思っていたのですが、関数ポインタにそのstatic関数のアドレスさえ渡すことができれば呼べるようです。
とはいうものの、static関数のプロトタイプ宣言は自由に実装ファイル以外に含めることができない(含めると『実装が無い』などのコンパイルエラーになります)ので、 externの関数(普通の関数)と同様に自由に呼び出せるという分けではないです。
使う場合は、参考サイトに記載されている例のように、static関数のアドレスを含む変数を取得する関数(こちらはexternの関数)を同じファイルに定義しておき、その関数経由でstatic関数を実行する、という使い方をするようです。
参考にしたサイト
『CとC++では扱いが異なるスコープとリンケージの関係を確かめる』
(次のサイトは使っている例が載っていました)