[완료]enum ~ 열거형 변수 질문입니다.
지금 맡고 있는 프로젝트에서
구조체가 선언이 되어 있구 그 구조체에 값을 할당해서 전송만 하면되는 아주 간단한 업무 입니다.
그런데 LINUX UNIX 다 끝내고 WINDOW 로 포팅을 하는데 구조체에 변수 할당에서 에러가 떨어집니다.
==============================================================================
typedef enum otp_pwe_t {
PWE_PAP = 1,
PWE_CHAP = 3,
PWE_MSCHAP = 5,
PWE_MSCHAP2 = 7,
} otp_pwe_t;
typedef struct otp_request_t {
int version; /* 2 */
char username[32 + 1];
char challenge[17 + 1]; /* USER challenge */
char service_type; // enum service type
struct {
otp_pwe_t pwe;
} pwe;
} otp_request_t;
===================================================
구조체의 형태 입니다.
저 구조체에 값을 할당하는 부분입니다.
============================================
otp_request_t request;
request.version = 2;
strcpy(request.username, ID);
request.service_type = '9';
request.pwe.pwe = 1;
strcpy(request.pwe.u.pap.passcode, PC);
=======선배가만듬 전 분석================
========================================
그런데 문제는
request.pwe.pwe = 1; 이부분입니다.
리눅스와 유닉스에선 멀쩡했었는데 에러가 떨어지네요
cannot convert from 'const int' to 'enum otp_pwe_t'
제 짧은 영어로봐서 열거형 변수에 int값을 넣어서 에러다 인거 같은데
제가 아는 열거형도
enum a{aa=1}
enum a b
printf("%d",b.aa)
화면| 1 |
이렇게 aa는 1이다 이런식의 변수처럼 되는걸로 아는데
구조체안의 구조체안에 열거형 변수에 값을 넣어준다? 이건 좀 이해가 안되네요
분석이라 물어볼수도 없어서 여기에 글을 남김니다. 부탁드려요 왜저렇게 쓰는지 윈도우에서는 어케해야되는지좀
갈쳐주세요~
enum도 하나의 새로운
enum도 하나의 새로운 자료형을 정의하는 것이나 다름없습니다.
다만 int와 그 값이 호환가능한 것이죠.
그렇기 때문에, enum으로 선언된 변수에 (비록 실제 값은 같일지라도) 다른 형인 int를 직접 대입할 순 없습니다.
C++같은 경우는 바로 에러 나는데, C에서는 어떤지 모르겠네요.
이경우에는 가장 적합한 방법은 swith나 if-else를 이용해서 int값에 해당하는 enum 변수를 찾아서 대입하는 방법입니다.
하지만 이건 꽤 번거로울수 있기 떄문에 그냥 바로 int에서 enum형으로(이경우는 otp_pwe_t로) 캐스팅 해서 대입할 수 있습니다.
다만 이경우는 enum에 선언되지 않은 값이 입력될 가능성이 있기 때문에, 논리적으로 생각해서 이 int값은 형변환을 그대로 해도 유효한 값이라는 것을 보장할 수 있거나, 혹은 입력 받는 쪽에서 예상치 못한 값이 들어왔을때 예외처리를 해주는 등 신경써주어야 할 부분이 생길수 있습니다.
가급적이면 int인 1대신에, 실제로 의미를 가지고 있는 otp_pwe_t의 PWE_PAP를 대입하는게, 의미상으로도 훨씬 적합할 것입니다.
그리고 함수에서 값을 주고 받을 때도, int로 주고 받지 말고, otp_pwe_t로 값을 주고 받아야겠지요.
그렇지 않으면, 결국 enum선언을 했을때 얻을 수 있는 것을 버리고, #define으로 정의한 상수와 다를바가 없어집니다.
지금까지 사용하신 컴파일러에선 아마 자동으로 형변환을 해주었던걸, 새로 사용하신 컴파일러에선 형변환 해주지 않고 에러를 출력하도록 만들어져있는 듯합니다.
결국
캐스팅 시키면 됩니다.
댓글 달기