source

두 개의 enum에는 몇 가지 공통 요소가 있는데, 왜 오류가 발생합니까?

nicesource 2023. 10. 16. 21:53
반응형

두 개의 enum에는 몇 가지 공통 요소가 있는데, 왜 오류가 발생합니까?

내 코드에 두개의 enum이 있습니다.

enum Month {January, February, March, April, May, June, July,
        August, September, October, November, December};
enum ShortMonth {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};

May는 두 enum에서 공통적으로 사용되는 요소이므로 컴파일러는 다음과 같이 말합니다.

열거자 ' '을(를)May 다시 선언합니다.

왜 그렇게 나와 있죠?어떻게 하면 이걸 피할 수 있을까요?

열거형 이름이 전역 범위에 있으므로 고유해야 합니다.열거형 기호를 열거형 이름으로 한정할 필요는 없으며 다음 작업만 수행합니다.

Month xmas = December;

없음:

Month xmas = Month.December;  /* This is not C. */

이러한 이유로 기호 이름 앞에 열거형 이름을 붙이는 사람들을 자주 볼 수 있습니다.

enum Month { Month_January, Month_February, /* and so on */ };

두 가지를 병합하는 것을 제안합니다.

enum Month {
  Jan, January=Jan, Feb, February=Feb, Mar, March=Mar, 
  Apr, April=Apr,   May,               Jun, June=Jun, 
  Jul, July=Jul,    Aug, August=Aug,   Sep, September=Sep, 
  Oct, October=Oct, Nov, November=Nov, Dec, December=Dec};

그것은 정확히 같은 효과를 가질 것이고, 더 편리할 것입니다.

1월의 값을 0이 아닌 1로 하려면 다음을 추가합니다.

enum Month {
  Jan=1, January=Jan, Feb, February=Feb, ....

C++에서는 이름 충돌을 방지하기 위해 Enum을 다음과 같은 구조로 감쌀 수 있습니다.

struct Month { enum {January, February, March, April, May, June, July,
        August, September, October, November, December}; };
struct ShortMonth { enum {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}; };

C++11에서는 범위 열거를 사용하여 이 문제를 해결할 수 있습니다.전역 범위에서 이름을 제거하고 열거 이름으로 범위를 지정합니다.

enum class Identity
{
       UNKNOWN = 1,
       CHECKED = 2,
       UNCHECKED =3
};

enum class Status
{
       UNKNOWN = 0,
       PENDING = 1,
       APPROVED = 2,
       UNAPPROVED =3
};

int main ()
{
    Identity::UNKNOWN;
    Status::UNKNOW;
}

Live Example

긴장 풀린 말.하지만 저는 또한 여러분의 예가 아주 특이한 예증의 사용처럼 보인다는 것을 말씀드리고 싶습니다.짧은 월과 긴 월이 모두 같은 것을 언급하는 것의 가치를 알 수 없습니다. 이것은 문자열에는 의미가 있지만, 숫자에는 의미가 없습니다.한 달 열거형만 가지면 어떻겠습니까?

여기서 제가 제안하는 것은 같은 종류이기 때문에 한 가지 열거만 하자는 것입니다.코드에 짧은 별칭을 적게 입력하고 싶다면 다음을 수행할 수 있습니다.

enum Month {
 January, Jan = January,
 February, Feb = February,
 March, Mar = March,
 April, Apr = April
 May,
 June, Jun = June,
 July, Jul = July,
 ...};

다른 프리젠테이션 이름(짧은 이름과 긴 이름)을 가지려면 열거형으로 색인화된 두 개의 서로 다른 문자열 배열이 있어야 합니다.

char[MAX_MONTH_NAME_LENGTH][12] month_long_names = {
  "January", "February", ...
}

char[3][12] short_long_names = {
  "Jan", "Feb", ...
}

printf("month %d long name is %s, and short name is %s\n", May, long_month_names[May], short_month_names[May]);

In Cenums는 유형 접두사 없이 사용되므로 다음과 같이 적습니다.

month[0] = January;  
month[4] = May;

enum Month와 Short Month는 범위가 같아서 컴파일러가 어떤 May를 사용할지 알 수 없습니다.명백한 해결책은 이 숫자들에 접두사를 붙이는 것이지만 이 경우에 이 숫자들을 사용하는 것이 정당한지 확신할 수 없습니다.

typedef enum {Jan, January, Feb, February, Mar, March, Apr, April, May, Jun, June, Jul, July,
    Aug, August, Sep, September, Oct, October, Nov, November, Dec, December} Month,ShortMonth;

병합하여 하나로 만들기

언급URL : https://stackoverflow.com/questions/2161940/two-enums-have-some-elements-in-common-why-does-this-produce-an-error

반응형