ストレージ・クラス指定子

ストレージ・クラス指定子は、変数、関数、およびパラメーターの宣言を詳細化するために使用します。 宣言で使用するストレージ・クラス指定子によって、次のことが決まります。

変数の場合、デフォルトのストレージ期間、スコープ、およびリンケージは、それが宣言される場所が ブロック・ステートメントまたは関数本文の内側か外側かによって異なります。これらのデフォルトでは十分でない場合、明示的なストレージ・クラス autostaticextern、または register を指定することができます。C++ では、追加のオプションを使うことによって、クラス・データ・メンバーが const として宣言されたオブジェクトの一部であったとしても、そのメンバーにストレージ・クラス mutable を指定し、それを変更可能にすることができます。

関数の場合は、ストレージ・クラス指定子が関数のリンケージを決めます。唯一のオプションは、extern および static です。extern ストレージ・クラス指定子を使って宣言された関数は、外部結合 を持ちます。これは、この関数が、他の変換単位から 呼び出し可能であるということを意味します。static ストレージ・クラス指定子を使って宣言された関数は、内部結合を持ちます。これは、この 関数が、関数が定義されている変換単位内でしか 呼び出しできないことを意味します。関数のデフォルトは、外部結合です。

C 関数仮パラメーターに指定できる唯一のストレージ・クラスは、register です。この理由は、関数仮パラメーターが auto 変数と同じ プロパティー (自動ストレージ期間、ブロック・スコープ、およびリンケージなし) を持つためです。

auto または register ストレージ・クラス指定子が指定された宣言は、 自動ストレージになります。static ストレージ・クラス指定子が指定された宣言は、静的ストレージになります。

extern ストレージ・クラス指定子が指定されていないローカルな宣言のほとんどは、 ストレージを割り振られます。ただし、関数宣言および型宣言は、ストレージを割り振られません。

ネーム・スペース・スコープ宣言またはグローバル・スコープ宣言で許可されるストレージ・ク ラス指定子は、staticextern のみです。C++ では、内部結合の指定に static は使用すべきでありません。 代わりに、名前のないネーム・スペースを使用します。

C および C++ におけるストレージ・クラス指定子は、以下のとおりです。

typedef は、機能よりも構文がストレージ・クラス指定子に 類似しているという理由と typedef 宣言は ストレージを割り振らないという理由で、ストレージ・クラス指定子に分類されます。

関連参照

IBM Copyright 2003