C ストレージ クラス
変数の "ストレージ クラス" は、項目が "グローバルな" 有効期間を持つか、"ローカルな" 有効期間を持つかを決定します。 C では、これらの 2 つの有効期間を "静的" と "自動" と呼んでいます。グローバルな有効期間を持つ項目はプログラムの実行を通して存在し、値が含まれます。 すべての関数にはグローバル有効期間があります。
ローカル有効期間を持つ自動変数、または変数は、自分が定義されているブロックに実行制御が渡されるたびに新しいストレージが割り当てられます。 実行から返るとき、変数には有効な値が含まれていません。
C には、次のストレージ クラス指定子が用意されています。
構文
storage-class-specifier
:
auto
register
static
extern
typedef
__declspec (
extended-decl-modifier-seq
)
/* Microsoft 固有の仕様 */
__declspec
を除いて、宣言の declaration-specifier
では 1 個の storage-class-specifier
のみ使用できます。 ストレージ クラスの指定が行われない場合、ブロック内の宣言により自動オブジェクトが作成されます。
auto
または register
指定子で宣言された項目にはローカルの有効期間があります。 static
または extern
指定子で宣言された項目にはグローバルの有効期間があります。
typedef
および __declspec
は他の 4 つの storage-class-specifier
終端要素とは意味が異なるため、個別に説明しています。 typedef
の具体的な情報については、「typedef
の宣言」を参照してください。 __declspec
の具体的な情報については、拡張ストレージ クラス属性に関するページをご覧ください。
ソース ファイル内の変数と関数宣言の配置は、ストレージ クラスと可視性にも影響します。 すべての関数定義の外側の宣言は、"外部レベル" で表示されます。関数定義内の宣言は、"内部レベル" で表示されます。
各ストレージ クラス指定子の厳密な意味は 2 つの要因に左右されます。
宣言が現れるのが、外部レベルか内部レベルか
宣言された項目が、変数または関数であるかどうか
「Storage-Class Specifiers for External-Level Declarations (外部レベル宣言のストレージ クラス指定子)」および「Storage-Class Specifiers for Internal-Level Declarations (内部レベル宣言のストレージ クラス指定子)」では、各種宣言の storage-class-specifier
終端要素について記載し、変数から storage-class-specifier
が省略されている場合の既定の動作について説明しています。 「Storage-Class Specifiers with Function Declarations (関数宣言を伴うストレージ クラス指定子)」では、関数と共に使用されるストレージ クラス指定子について説明します。