3

C++ 標準のセクション 7.1 では、ストレージ クラス指定子としての「extern」について言及されています。

[注: extern キーワードは、明示的インスタンス化およびリンケージ仕様でも使用できますが、そのようなコンテキストではストレージ クラス指定子ではありません。

このキーワードと「リンケージ指定」のコンテキストでの使用については理解していますが、ストレージ指定子としての「extern」の使用法を把握できません。

  1. すべての「extern」名に静的な保存期間があるわけではありませんか?
  2. 1 に対する答えが「はい」の場合、なぜこの冗長性が生じるのでしょうか? C 互換性?
4

3 に答える 3

7

externストレージ クラス指定子です。これは、言語文法の単なる事実です。externプログラムが使用される場所に応じて、プログラムのセマンティクスに多くの影響を与えます。どこでも同じ効果があるわけではありません。これは、オブジェクトの保存期間とリンクに影響を与え、一部の宣言が定義でもあるかどうかを判断するのにも役立ちます。

例えば:

int a; // Ex1

extern int b; // Ex2

たとえば、グローバル スコープの ifEx1Ex2where では、両方とも静的ストレージ期間と外部リンケージを持つオブジェクトを参照します。ただし、C++ では、1 つ目は定義 (C では仮の定義) で、2 つ目はそうではありません。この例externでは、宣言されたオブジェクトの保存期間またはリンケージは変更されていません。

関数本体でEx1andが発生した場合は、自動保存期間がありリンケージがないオブジェクトを参照しますが、外部リンケージがあり静的保存期間があるオブジェクトを参照します。この例では、リンク、保存期間、および定義であるかどうかの宣言の意味に影響を与えています。Ex2abextern

extern最後に、C++ では、リンケージを内部から外部に変更することだけが影響する例を次に示します。

const int c = 5; // static storage duration, internal linkage

extern const int d = 10; // static storage duration, external linkage
于 2010-10-22T06:57:45.387 に答える
2

それ自体は実際にはストレージ指定子ではありません。これは、他のストレージ指定子と同じように変数名の前に置かれますが、コンパイラーをシャットダウンして、リンカーにもっとや​​るべきことがあると伝えるだけです。

于 2010-10-22T04:57:30.550 に答える