열거형 상수를 정의하는 과정에서 정수형 상수 표현식(integer constant expression, ICE)C을 사용할 수 있다. ICE는 컴파일 시간에 정수 값을 제공하는 데 제약이 좀 있다. 값을 함수 호출로 표현할 수 없고 반드시 컴파일 시간에 결정할 수 있어야 하며, 값을 평가하는 과정에서 오브젝트를 피연산자로 사용할 수 없다.
signed const o42 = 42; enum { b42 = 42, // Ok: 42는 리터럴이다. c52 = o42 + 10, // 에러: o42는 오브젝트다. b52 = b42 + 10, // Ok: b42는 오브젝트가 아니다. };
여기서 o42에 const 지시자가 붙더라도 엄연히 오브젝트다. 따라서 c52에 대한 표현식은 ‘정수형 상수 표현식’이 아니다.
TAKEAWAY 5.44 정수형 상수 표현식(ICE)은 오브젝트를 평가하지 않는다.
따라서 원칙적으로 ICE에서 정수형 리터럴, 열거형 상수, _Alignof와 offsetof 부분 표현식, 몇 가지 sizeof 부분 표현식을 이용한 연산을 사용할 수 있다.9
값이 ICE이더라도 열거형 상수를 정의하는 데 사용하려면 signed 타입의 범위를 벗어나지 않아야 한다.
9 offsetof와 sizeof는 12.7절과 12.1절에서 자세히 소개한다.