外部のストレージ クラスの指定子
extern " ストレージ クラスの指定子を指定して宣言した変数はプログラムのソース ファイルの外部レベルと同じ名前の変数への参照です。extern の内部宣言が外部レベルで変数の定義をブロック内に表示するために使用されます。外部レベルでも宣言されて extern のキーワードで宣言された変数は宣言されたブロックでのみ表示されません。
使用例
この例では内部および外部レベルの宣言を示します :
// extern_StorageClassSpecified.c
#include <stdio.h>
void other( void );
int main()
{
// Reference to i, defined below:
extern int i;
// Initial value is zero; a is visible only within main:
static int a;
// b is stored in a register, if possible:
register int b = 0;
// Default storage class is auto:
int c = 0;
// Values printed are 1, 0, 0, 0:
printf_s( "%d\n%d\n%d\n%d\n", i, a, b, c );
other();
return;
}
int i = 1;
void other( void )
{
// Address of global i assigned to pointer variable:
static int *external_i = &i;
// i is redefined; global i no longer visible:
int i = 16;
// This a is visible only within the other function:
static int a = 2;
a += 2;
// Values printed are 16, 4, and 1:
printf_s( "%d\n%d\n%d\n", i, a, *external_i );
}
この例では変数 i は初期値 1. で外部レベルで定義されます。main の関数の extern の宣言が外部レベル i への参照を宣言するために使用されます。初期化子が省略されるため 静的 可変 a は既定ではは 0 に初期化されます。printf の呼び出しは値 100および 0 が出力されます。
other の関数で 静的 のポインター external_i 変数を初期化するためにグローバル変数 i のアドレスが使用されます。これはグローバル変数に 静的 の有効期間があるためアドレスはプログラムの実行中に変更されないことを意味して作業します。次に変数 i は初期値 16 を持つローカル変数として再定義されています。この再定義はローカル変数の名前によって隠ぺい外部レベル i の値には影響しません。グローバル i の値はポインターを通じて external_i このブロック内に間接的だけにアクセスできます。ポインターに 自動 可変 i のアドレスを代入しようとすると入力されるたびに異なる可能性があるためブロックしません。変数 a は 静的 の変数として宣言および 2. に初期化されます。この a は main の a と内部レベルの 静的 の変数が宣言されたブロック内でのみ表示されるため競合しません。
変数が強化 a 24 を結果として返します。other の関数が同じプログラムで再び呼び出された場合a の初期値は 4. です。 静的 の内部変数は値をプログラムの終了時に格納し宣言されたブロックを再入力します。