C: 内部リンケージを指定するキーワードが `static' なのは何故?

C 言語の static - 言語ゲーム さんより。


static キーワードの2面性は Cの暗黒面の一つとして有名ですが、なぜ `static' という語をなのかというのを意識したことはありませんでした。言われてみれば不思議です。ちょっと考えてみました*1


まずはおさらい。static キーワードは、

  • ブロック内部のオブジェクトの宣言に付けられた場合 → 記憶クラス(静的領域確保)を示す
  • トップレベルのオブジェクトの宣言に付けられた場合 → リンケージ(内部リンケージ)を示す

という二面性を持っています。


まず、ブロック内(≒関数内)から見ると、この `static' は 通常の関数内変数 につける `auto' キーワードと対になっていて、領域の静的確保と自動確保 とよくあった用語です。

`auto' や`static' は 記憶クラス指定子 と呼ばれます。 C の変数 / 関数宣言時には、「型」と「記憶クラス」という二つの属性を与えなければいけません。

ブロック内で 記憶クラス指定しが用いられた場合、そのまま 変数の記憶クラスを表します。また、記憶クラス指定子が省略された場合は、`auto' が指定されたものとされます。


さて、変数はブロック外にも 宣言できますが、この場合適用出来る記憶クラスは当然 `static' のみになります。

外部変数 / 関数宣言の static修飾が、リンケージ指定の意味を持ってしまうというのは、(直接 static キーワードに2面の意味を持たせたというよりは)、実質上 記憶クラスには`static' しか指定できないことをいいことに、どうも「記憶クラス指定子を省略する」ことに「外部リンケージ指定」という意味を与えてしまった為ではないかと思えます。ブロック外の宣言のデフォルトは内部リンケージであり、外部リンケージを指定する方法が「記憶クラス指定子の省略」ではないかと。

つまり、迷探偵猫の推理としては「内部リンケージを指定するのになぜ `static' という語を選んだのか」の答えは、「『記憶クラス指定子の省略 = 外部リンケージ』というルールであり、正確には『`static' キーワードを付けると内部リンケージになる』というルール ではない、`static'キーワード自身は何処で使われようと静的記憶クラスを示している。」ということです。原典は見つかりませんでしたが、K&R の付録A あたりの `static'に対する微妙な言い回しにそんなことを感じます。

事の真相はわかりません。「そうなんじゃないかな〜」と思うだけです。知っている人教えてくださいましまし。

参考

C の記憶クラス指定子についてはYutaka Yasuda, Kyoto Sangyo Universityさんのプログラミング Cの、記憶クラスと変数の初期設定分割コンパイルとリンケージに非常に良くまとまっています。

*1:「調べてみました」じゃないのがミソ