4

GCCは、列挙型の個別の値に同じ名前を使用できないことを教えてくれます。

enum flag_one {
    SUCCESS,
    FAIL
}

enum flag_two {
    SUCCESS,
    FAIL
}

コンパイラでは許可されていません。では、スコープは列挙定義の「範囲内」ではありませんか?

次のようなことをするアプローチです:

enum flag_one {
    FLAG_ONE_SUCCESS,
    FLAG_ONE_FAIL
}

enum flag_two {
    FLAG_TWO_SUCCESS,
    FLAG_TWO_FAIL
}

より読みやすく/説明しやすいように、戻り整数コードに列挙型を使用するのが好きなので、少し混乱していますが、すでに名前の衝突が発生し始めています

4

2 に答える 2

6

では、スコープは列挙定義の「範囲内」ではありませんか?

いいえ、これは許可されていません。列挙子リストは定数を定義します。あなたenumの s はたまたま同じスコープ、つまりファイル スコープにあります。同じスコープ内に同じ名前の定数を 2 つ持つことはできません。

CXのドラフトから:

6.7.2.2 列挙指定子

セマンティクス

3列挙子リストの識別子は、int 型の定数として宣言され、そのようなものが許可されている場所ならどこにでも表示できます。127) [...]

また、脚注 127 から (これは技術的に非規範的であり、情報提供のみを目的としています):

127) したがって、同じスコープで宣言された列挙定数の識別子はすべて、互いに区別され、通常の宣言子で宣言された他の識別子とは区別されます。

.

戻り整数コードに列挙型を使用するのが好きなので、少し混乱しています [...]

EXIT_SUCCESSEXIT_FAILURE定義されていますstdlib.h

于 2012-05-18T15:51:57.437 に答える
3

列挙値は、列挙型のスコープで表示されます。つまり、その範囲内で一意でなければなりません。

enum classC++11 などの他の言語では、値が外側のスコープに直接表示されない新しい種類の emum が追加されています。

次に、値を書き込んflag_one::SUCCESSflag_two::SUCCESS取得する必要があるため、2番目のオプションと大きな違いはありません。

于 2012-05-18T15:52:46.490 に答える