extern ストレージ クラス指定子
ストレージクラス指定子 extern
を使用して宣言された変数は、別のソース ファイルで定義されている同じ名前の変数への参照となります。 これは、外部レベル変数の定義を可視化するために使用されます。 extern
として宣言された変数自体に記憶域は割り当てられません。これは単なる名前です。
例
この例では、内部および外部レベルの宣言を示しています。
// Source1.c
int i = 1;
// Source2. c
#include <stdio.h>
// Refers to the i that is defined in Source1.c:
extern int i;
void func(void);
int main()
{
// Prints 1:
printf_s("%d\n", i);
func();
return;
}
void func(void)
{
// Address of global i assigned to pointer variable:
static int *external_i = &i;
// This definition of i hides the global i in Source.c:
int i = 16;
// Prints 16, 1:
printf_s("%d\n%d\n", i, *external_i);
}
この例では、変数 i
は Source1.c 内で、初期値 1 として定義されます。 Source2.c 内での extern
宣言は、このファイル内で 'i' を参照できるようにします。
func
関数では、 static
ポインター変数 external_i
を初期化するために、グローバル変数 i
のアドレスが使用されます。 グローバル変数の有効期間が static
である、つまりプログラム実行中にアドレスが変わることがないので、これは機能します。 次に、変数 i
は、func
のスコープ内で、初期値 16 のローカル変数として定義されます。 この定義は、外部レベルの i
の値には影響しません。この値は、ローカル変数用にその名前を使用することで隠されています。 ここでグローバルな i
の値にアクセスするには、external_i
ポインターを使用するしかありません。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示