더북(TheBook)

5.6.4 복합 리터럴

상수를 표현하는 리터럴이 없는 타입은 상황이 좀 복잡하다. 이런 타입은 매크로에서 교체할 텍스트를 적는 부분을 복합 리터럴(compound literal)C로 지정해야 한다. 복합 리터럴은 다음과 같이 소괄호 안에 타입을 적고 나서 초기자를 적는다.

(T) { INIT }

예를 들면 다음과 같다.

# define CORVID_NAME /**/        \
(char const*const[corvid_num]){  \
  [chough] = "chough",           \
  [raven]  = "raven",            \
  [magpie] = "magpie",           \
  [jay]    = "jay",              \
}

이렇게 하면 앞의 예제에서 for 루프를 작성할 때 bird 배열 대신 방금 정의한 CORVID_NAME 매크로를 넣을 수 있다.

for (unsigned i = 0; i < corvid_num; ++i)
    printf("Corvid %u is the %s\n", i, CORVID_NAME[i]);

매크로를 정의할 때 복합 리터럴을 사용하면 지정한 타입의 상수처럼 작동하도록 선언할 수 있지만, 엄밀히 말해서 C 언어의 상수는 아니다.

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