次の方法で共有


ストレージ クラス

関数定義では、ストレージクラス指定子により、関数に extern または static のストレージクラスが指定されます。

構文

function-definition:
declaration-specifiersopt attribute-seqopt declarator declaration-listopt compound-statement

/* attribute-seq は Microsoft 固有の仕様です */

declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt

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 固有の仕様はここまで

関連項目

C 関数の定義