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를 출력하는 것을 목적으로 합니다.

You may also like...