Skip to main content

Posts

Showing posts from October, 2009

arraysizeof macro

다음 macro는 array의 length를 구하는 것인데 해석이 되시나요? template <typename T, size_t N> char (&Helper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(Helper(array))) ... 안되신 분들을 위한 설명입니다. ;) 위 코드는 다음 두가지 사실만 알고 있다면 (비교적) 쉽게 이해됩니다. sizeof는 function call syntax에 대해서도 동작하며 그 function의 return type에 대해 동작한다. int foo() { return int(); } ... sizeof(foo()) == sizeof(int) array type의 reference를 리턴하는 method의 signature는 다음과 같다. char (&bar)[10]() { ... } 이를 바탕으로 arraysizeof를 만들려면 char(&)[N]을 리턴하는 method를 만들면 되죠. 여기서 N은 array의 length. template <typename T, size_t N> char (&Helper(T (&array)[N]))[N] { ... } 위 함수는 T(&)[N]을 parameter로 받아 char(&)[N]을 리턴합니다. 물론 T(&)[N] parameter는 이 template method의 implicit instantiation이 동작하도록 하기 위해 필요합니다. 마지막으로 sizeof는 method body가 필요없으므로... template <typename T, size_t N> char (&Helper(T (&array)[N]))[N]; 끝. 참고로 이런 코드가 필요한 이유는 널리 쓰이는 "sizeof(array) / sizeof(*array)" macro가 다음과 같은 경우 compile error없이 오동작하기