言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

C 言語の static

白状すると、今日まで C 言語の static の使い方を知りませんでした。

僕は自分でプログラムを一から書くよりも圧倒的に人の書いたプログラムを修正する方が多いので、適当に最初に書いた人の真似をするだけで何とかなってました。だから文法の知識で知らない事はいっぱいです。C では大規模な仕事なんてしないのでそれでよかったんですよ。しかもライブラリについては大体どんな開発環境でも詳しいマニュアルがついてくるけど、文法については常識だからか、電子的に便利に纏まってないでしょ(あったら教えてください)。知らない物を見ても調べないままだったのです。言い訳終わり。

参考までに C の static について書くと、static とは、普通関数定義の中に書くと、関数の処理が終わっても消えないメモリ領域になります。つまり、次回その関数にやってきた時、再びさっきの結果を使えるわけ。醜悪な仕様だとは思うけど、便利は便利。それに、static(静止した)という言葉の意味にもあってる。

int counter() {
  static int c= 0;
  return ++c;
}

一方関数定義の外側に置くと、意味が全然違って来て、他のソースコードから参照できないプライベートな名前になる。これが何故 static と言うのか謎(これも知ってる人がいたら教えてください)。

int PublicNumber= 0;
static int privateNumber= 0;

さて、今まで死ぬほど大量のソースコードを読んでいたのに何故気がつかなかったかと言うと、C 言語においては、ヘッダファイルなんかで宣言の無い関数や変数は全部プライベートなのだと勝手に思い込んでいたから。だって一応警告は出るし、どうせなら警告じゃなくてちゃんとエラーにしてくれたら良いのにと思ってました。LL言語の流行る昨今。私のような不勉強者が他にもいるのではと思いここに記します。