더북(TheBook)

열거형 상수를 정의하는 과정에서 정수형 상수 표현식(integer constant expression, ICE)C을 사용할 수 있다. ICE는 컴파일 시간에 정수 값을 제공하는 데 제약이 좀 있다. 값을 함수 호출로 표현할 수 없고 반드시 컴파일 시간에 결정할 수 있어야 하며, 값을 평가하는 과정에서 오브젝트를 피연산자로 사용할 수 없다.

signed const o42 = 42;
enum {
  b42 = 42,       // Ok: 42는 리터럴이다.
  c52 = o42 + 10, // 에러: o42는 오브젝트다.
  b52 = b42 + 10, // Ok: b42는 오브젝트가 아니다.
};

여기서 o42const 지시자가 붙더라도 엄연히 오브젝트다. 따라서 c52에 대한 표현식은 ‘정수형 상수 표현식’이 아니다.

TAKEAWAY 5.44 정수형 상수 표현식(ICE)은 오브젝트를 평가하지 않는다.

따라서 원칙적으로 ICE에서 정수형 리터럴, 열거형 상수, _Alignofoffsetof 부분 표현식, 몇 가지 sizeof 부분 표현식을 이용한 연산을 사용할 수 있다.9

값이 ICE이더라도 열거형 상수를 정의하는 데 사용하려면 signed 타입의 범위를 벗어나지 않아야 한다.

 

 


  9 offsetofsizeof는 12.7절과 12.1절에서 자세히 소개한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.