typeof 를 사용하는 typecheck 매크로
#define typecheck(type,x) \ ({ type __dummy; \ typeof(x) __dummy2; \ (void)(&__dummy == &__dummy2); \ 1; \ })
위의 코드는 어떤 역할을 할까요 ? 한 라인씩 해독을 해보죠.
type __dummy;
인자로 전달받은 type 과 동일한 type 으로 __dummy 라는 이름의 변수를 선언
typeof(x) __dummy2;
인자로 전달받은 x 와 동일한 type 으로 __dummy2 라는 이름의 변수를 선언
(void)(&__dummy == &__dummy2);
두 개의 포인터를 비교하는데 이것은 두 더미 변수가 match되어야만 컴파일 시 warning 없이 출력되고, 두 변수의 타입이 다르면 pointer mismatch warning을 출력(-Werror 로 컴파일하면 error를 띄움)
1;
이것은 expression의 value입니다. TRUE와 같은 의미이며 결국 typecheck()의 결과는 1 이 됩니다.
결국 typecheck(type, x) 매크로는 만약 x가 원하던 type이 아니라면 compilation warning/error를 출력하는 것을 목적으로 합니다.