extern
ストレージ クラス指定子です。これは、言語文法の単なる事実です。extern
プログラムが使用される場所に応じて、プログラムのセマンティクスに多くの影響を与えます。どこでも同じ効果があるわけではありません。これは、オブジェクトの保存期間とリンクに影響を与え、一部の宣言が定義でもあるかどうかを判断するのにも役立ちます。
例えば:
int a; // Ex1
extern int b; // Ex2
たとえば、グローバル スコープの ifEx1
とEx2
where では、両方とも静的ストレージ期間と外部リンケージを持つオブジェクトを参照します。ただし、C++ では、1 つ目は定義 (C では仮の定義) で、2 つ目はそうではありません。この例extern
では、宣言されたオブジェクトの保存期間またはリンケージは変更されていません。
関数本体でEx1
andが発生した場合は、自動保存期間がありリンケージがないオブジェクトを参照しますが、外部リンケージがあり静的保存期間があるオブジェクトを参照します。この例では、リンク、保存期間、および定義であるかどうかの宣言の意味に影響を与えています。Ex2
a
b
extern
extern
最後に、C++ では、リンケージを内部から外部に変更することだけが影響する例を次に示します。
const int c = 5; // static storage duration, internal linkage
extern const int d = 10; // static storage duration, external linkage