C 언어의 열거형(enum)은 정수 형태의 명명된 상수 집합을 정의하는 방법입니다. 전형적인 구문은 다음과 같습니다:
enum Color { RED, GREEN, BLUE };
기본적으로 첫 번째 값은 0이 할당되며, 이후 각 값에는 이전 값 + 1이 할당됩니다.
열거형의 장점:
enum을 독립적인 타입으로 사용할 경우).단점:
enum의 기본 타입은 int입니다(사전 C99), 따라서 엄격한 타입 안전이 보장되지 않습니다.enum과 int 간의 묵시적 변환이 가능하여 범위 검사가 없습니다.enum MyType : unsigned char — 그러나 이는 확장 기능입니다).예:
enum State { INIT = -1, RUNNING = 0, PAUSED = 1, STOPPED = 2 }; enum State current = RUNNING;
질문: 서로 다른 열거형 값들을 안전하게 비교할 수 있나요?
답변: 기술적으로 enum의 값은 int이므로 서로 다른 열거형 변수들을 비교할 수 있지만 바람직하지 않습니다. 이는 의미의 손실을 초래하고 읽는 사람을 혼란스럽게 하여 향후 코드 유지 관리가 복잡해질 수 있습니다. 타입을 명시적으로 변환하거나 열거형을 논리적으로 재구성하는 것이 좋습니다.
오류 예:
enum Fruit { APPLE, BANANA }; enum Animal { CAT, DOG }; if ((enum Fruit)BANANA == (enum Animal)CAT) { ... } // 논리적 오류
역사
IPC 프로토콜의 메시지가 고유하지 않은 #define로 제한되어 프로토콜 확장 시 값 충돌이 발생했습니다. enum으로 변환하여 사용되는 식별자를 관리하고 디버깅을 단순화할 수 있었습니다.
역사
큰 라이브러리에서 상태 처리를 고정된 int 값으로 수행했습니다. 리팩토링 시 모든 define이 새 값으로 동기화되는 것을 잊어버렸습니다. enum을 사용하여 이를 방지할 수 있었지만 한 모듈이 오래된 define을 계속 사용하여 찾기 어려운 오류가 발생했습니다.
역사
로봇 노드를 관리하는 시스템에서 엔지니어가 enum의 첫 번째 요소에 대한 값을 명시적으로 설정하지 않았습니다(두 번째와 세 번째만 사용됨). 프로그램이 잘못 작동했는데, 왜냐하면 기본적으로 첫 번째 요소의 값이 0이 되어 교환 프로토콜의 논리와 충돌했기 때문입니다.