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 언어의 상수는 아니다.