宣言の位置
名前は宣言子の直後、ただし初期化子 (省略可能) よりも前の位置で宣言されるものと見なされます (宣言子の詳細については、「宣言子」を参照)。 列挙子はそれを指定する識別子の直後、ただし初期化子 (省略可能) よりも前の位置で宣言されるものと見なされます。
次の例について考えます。
// 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
};
上のコードでは、識別子が既にグローバル スコープで定義されているため、エラー メッセージが生成されます。
注意
複数のプログラム要素 (列挙子とオブジェクトなど) を同じ名前で参照することは、プログラミング手法として適切ではなく、回避する必要があります。上のコード例では、この手法を使用しているためエラーが発生します。