"宣言" は、識別子のセットの解釈と属性を指定します。 識別子によって名前付けされたオブジェクトまたは関数のストレージも予約される宣言は、"定義" と呼ばれます。変数、関数、および型の C 宣言には、次の構文があります。
構文
declaration:
declaration-specifiers
attribute-seq
optinit-declarator-list選ぶ;
/*
attribute-seq
opt は Microsoft 固有の */
declaration-specifiers:
storage-class-specifier
declaration-specifiers
選ぶ
type-specifier
declaration-specifiers
選ぶ
type-qualifier
declaration-specifiers
選ぶ
init-declarator-list:
init-declarator
init-declarator-list
,
init-declarator
init-declarator:
declarator
declarator
=
initializer
注
次のセクションでは、 declaration のこの構文は繰り返しません。 以降のセクションの構文は、通常、非終端 declarator で始まります。
init-declarator-list内の宣言には、名前が付けられている識別子が含まれています。initは初期化子の省略形です。
init-declarator-listは宣言子のコンマ区切りのシーケンスであり、それぞれが追加の型情報、初期化子、またはその両方を持つことができます。
declaratorには、宣言されている識別子 (存在する場合) が含まれます。 非終端 declaration-specifiers は、リンケージ、ストレージ期間、および宣言子が示すエンティティの型の少なくとも一部を示す型とストレージ クラス指定子のシーケンスで構成されます。 宣言は、ストレージ クラス指定子、型指定子、型修飾子、宣言子、初期化子の組み合わせで構成されます。
宣言には、 attribute-seqに記載されている省略可能な属性を 1 つ以上含めることができます。 seq はシーケンスの省略形です。 これらの Microsoft 固有の属性は、この書籍全体で詳しく説明されているいくつかの関数を実行します。
変数宣言の一般的な形式では、 type-specifier は変数のデータ型を指定します。
type-specifierは、constまたはvolatileによって型が変更された場合と同様に、化合物にすることができます。
declaratorは変数の名前を指定します。配列またはポインター型を宣言するように変更された可能性があります。 たとえば、
int const *fp;
は、 fp という名前の変数を、変更できない (const) int 値へのポインターとして宣言します。 複数の宣言子をコンマで区切って使用することで、宣言で複数の変数を定義できます。
宣言には少なくとも 1 つの宣言子が必要です。または、その型指定子は、列挙型の構造体タグ、共用体タグ、またはメンバーを宣言する必要があります。 宣言子は、識別子に関する残りの情報を提供します。 宣言子は、それぞれ角かっこ ([ ])、アスタリスク (*)、またはかっこ ( ( ) ) で変更して配列、ポインター、または関数型を宣言できる識別子です。 単純変数 (文字、整数、浮動小数点項目など) または単純変数の構造体と共用体を宣言する場合、 declarator は単なる識別子です。 宣言子の詳細については、「 宣言子と変数宣言」を参照してください。
すべての定義は暗黙的に宣言されますが、すべての宣言が定義であるわけではありません。 たとえば、 extern ストレージ クラス指定子を使用する変数宣言は、"定義" 宣言ではなく"参照" です。 外部変数を定義する前に参照する場合、または外部変数を使用する別のソース ファイルで定義されている場合は、 extern 宣言が必要です。 ストレージは、"参照" 宣言によって割り当てられず、宣言で変数を初期化することもできません。
変数宣言では、ストレージ クラスまたは型 (またはその両方) が必要です。
__declspecを除き、宣言で許可されるストレージ クラス指定子は 1 つだけであり、すべてのストレージ クラス指定子がすべてのコンテキストで許可されるわけではありません。
__declspecストレージ クラスは、他のストレージ クラス指定子で使用でき、複数回許可されます。 宣言のストレージ クラス指定子は、宣言された項目の格納方法と初期化方法、およびプログラムのどの部分が項目を参照できるかに影響します。
C で定義される storage-class-specifier ターミナルには、 auto、 extern、 register、 static、および typedefが含まれます。 Microsoft C には、 storage-class-specifier ターミナル __declspecも含まれています。
typedefと__declspecを除くすべてのstorage-class-specifierターミナルについては、ストレージ クラスで説明します。
typedefの詳細については、「typedef宣言」を参照してください。
__declspecの詳細については、「拡張 Storage-Class 属性」を参照してください。
ソース プログラム内の宣言の場所と、変数の他の宣言の有無は、変数の有効期間を決定する上で重要な要素です。 再宣言は複数存在できますが、定義は 1 つだけです。 ただし、1 つの定義を複数の翻訳単位に含めることができます。 内部リンケージを持つオブジェクトの場合、内部リンクオブジェクトは翻訳単位に固有であるため、このルールは各変換単位に個別に適用されます。 外部リンケージを持つオブジェクトの場合、このルールはプログラム全体に適用されます。 可視性の詳細については、「 有効期間、スコープ、可視性、およびリンケージ」を参照してください。
型指定子は、識別子のデータ型に関するいくつかの情報を提供します。 既定の型指定子は int。 詳細については、「 型指定子」を参照してください。 型指定子は、型タグ、構造体および共用体コンポーネント名、および列挙定数を定義することもできます。 詳細については、「 列挙宣言、 構造体宣言、 および共用体宣言」を参照してください。
constとvolatileの 2 つのtype-qualifierターミナルがあります。 これらの修飾子は、l 値を使用してその型のオブジェクトにアクセスする場合にのみ関連する型の追加のプロパティを指定します。
constとvolatileの詳細については、「型修飾子」を参照してください。 l 値の定義については、「 L 値式と R 値式」を参照してください。