次の方法で共有


宣言の位置

名前は宣言子の直後、ただし初期化子 (省略可能) よりも前の位置で宣言されるものと見なされます (宣言子の詳細については、「宣言子」を参照)。 列挙子はそれを指定する識別子の直後、ただし初期化子 (省略可能) よりも前の位置で宣言されるものと見なされます。

次の例について考えます。

// point_of_declaration1.cpp
// compile with: /W1 
double dVar = 7.0;
int main()
{
   double dVar = dVar;   // C4700
}

仮に、宣言の位置が初期化より "後" であれば、ローカル dVar は 7.0 (グローバル変数 dVar の値) に初期化されます。 しかし、実際にはそうでないため、dVar は未定義の値に初期化されます。

列挙子も同じ規則に従います。 ただし、列挙子は列挙体の外側のスコープにエクスポートされます。 次の例では、Spades、Clubs、Hearts、Diamonds という列挙子が宣言されています。 列挙子は外側のスコープにエクスポートされるため、グローバル スコープを持つと見なされます。 このコード例の識別子は、既にグローバル スコープで定義されています。

次のコードがあるとします。

const int Spades = 1, Clubs = 2, Hearts = 3, Diamonds = 4;
enum Suits
{
    Spades = Spades,     // error
    Clubs,               // error
    Hearts,              // error
    Diamonds             // error
};

上のコードでは、識別子が既にグローバル スコープで定義されているため、エラー メッセージが生成されます。

注意

複数のプログラム要素 (列挙子とオブジェクトなど) を同じ名前で参照することは、プログラミング手法として適切ではなく、回避する必要があります。上のコード例では、この手法を使用しているためエラーが発生します。

参照

関連項目

スコープ