ストレージ クラス
関数定義では、ストレージクラス指定子により、関数に extern
または static
のストレージクラスが指定されます。
構文
function-definition
:
declaration-specifiers
opt attribute-seq
opt declarator
declaration-list
opt compound-statement
/* attribute-seq
は Microsoft 固有の仕様です */
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
storage-class-specifier
: /* 関数定義用 */
extern
static
関数定義に storage-class-specifier
が含まれていない場合、ストレージ クラスは既定で extern
になります。 関数を extern
として明示的に宣言することもできますが、必須ではありません。
関数の宣言に storage-class-specifier
extern
が含まれる場合、その識別子は、ファイル スコープで宣言されたあらゆる可視の該当識別子と同じリンケージを持ちます。 ファイル スコープで可視の宣言がない場合、その識別子は外部リンケージを持ちます。 識別子がファイル スコープで、storage-class-specifier
がない場合、その識別子は外部リンケージを持ちます。 外部リンケージは、その識別子の各インスタンスが同じオブジェクトまたは関数を表すことを意味します。 リンケージとファイル スコープの詳細については、「有効期間、スコープ、可視性、およびリンケージ」を参照してください。
extern
以外のストレージ クラス指定子を持つブロック スコープの関数を宣言すると、エラーが発生します。
static
ストレージ クラスとして宣言された関数は、定義されているソース ファイル内でのみ可視になります。 それ以外のすべての関数は、extern
ストレージ クラスの指定が明示的か暗黙的かに関係なく、プログラムのすべてのソース ファイルで可視になります。 static
ストレージ クラスを指定する必要がある場合は、その関数の宣言が最初に発生する場所 (存在する場合) の関数定義で宣言する必要があります。
Microsoft 固有の仕様
Microsoft 拡張機能が有効な場合、最初にストレージ クラスを指定せずに (または extern
ストレージ クラスで) 宣言された関数が static
ストレージ クラスとなるのは、最初と同じソース ファイルに含まれる関数定義で、 static
ストレージ クラスが明示的に指定された場合です。
/Ze コンパイラ オプションを指定してコンパイルすると、extern
キーワードを使用してブロック内で宣言された関数はグローバルで可視になります。これは /Za を指定してコンパイルした場合には当てはまりません。 ソース コードの移植性を考慮している場合は、この機能に依存しないでください。
Microsoft 固有の仕様はここまで