ストレージ・クラス指定子は、変数、関数、およびパラメーターの宣言を詳細化するために使用します。 宣言で使用するストレージ・クラス指定子によって、次のことが決まります。
変数の場合、デフォルトのストレージ期間、スコープ、およびリンケージは、それが宣言される場所が ブロック・ステートメントまたは関数本文の内側か外側かによって異なります。これらのデフォルトでは十分でない場合、明示的なストレージ・クラス auto、static、extern、または register を指定することができます。C++ では、追加のオプションを使うことによって、クラス・データ・メンバーが const として宣言されたオブジェクトの一部であったとしても、そのメンバーにストレージ・クラス mutable を指定し、それを変更可能にすることができます。
関数の場合は、ストレージ・クラス指定子が関数のリンケージを決めます。唯一のオプションは、extern および static です。extern ストレージ・クラス指定子を使って宣言された関数は、外部結合 を持ちます。これは、この関数が、他の変換単位から 呼び出し可能であるということを意味します。static ストレージ・クラス指定子を使って宣言された関数は、内部結合を持ちます。これは、この 関数が、関数が定義されている変換単位内でしか 呼び出しできないことを意味します。関数のデフォルトは、外部結合です。
関数仮パラメーターに指定できる唯一のストレージ・クラスは、register です。この理由は、関数仮パラメーターが auto 変数と同じ
プロパティー (自動ストレージ期間、ブロック・スコープ、およびリンケージなし) を持つためです。
auto または register ストレージ・クラス指定子が指定された宣言は、 自動ストレージになります。static ストレージ・クラス指定子が指定された宣言は、静的ストレージになります。
extern ストレージ・クラス指定子が指定されていないローカルな宣言のほとんどは、 ストレージを割り振られます。ただし、関数宣言および型宣言は、ストレージを割り振られません。
ネーム・スペース・スコープ宣言またはグローバル・スコープ宣言で許可されるストレージ・ク ラス指定子は、static と extern のみです。C++ では、内部結合の指定に static は使用すべきでありません。 代わりに、名前のないネーム・スペースを使用します。
C および C++ におけるストレージ・クラス指定子は、以下のとおりです。
関連参照