대충 요약해서 아래와 같은 매크로가 있었다.
#define MAKE_STRING0(str1) L#str #define MAKE_STRING(str1, str2) L#str1 L#str2
MAKE_STRING0 를 없애려고 variadic macro 1 를 써보려고 했음.
#define MAKE_STRING(str1, ...) #str1 #__VA_ARGS__ //non-unicode
MAKE_STRING(any_token) 이런 식으로 2번째 파라미터가 없을 때 non-unicode 버전으로 만들면 문제 없으나
#define MAKE_STRING(str1, ...) L#str1 L#__VA_ARGS__ //unicode
unicode 버전에서는 __VA_ARGS__ 가 사라지면서 “L” 만 남는 불상사가!
macro overloading 뭐 비슷한게 없을 까 해서 stackoverflow 를 찾아보니 http://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments 흐익 이런 트릭이…
여기서 아이디어를 얻어와서 다음과 같은 방식으로 해결!
#define TO_UNICODE_IMPL(first, ...) L#first #define TO_UNICODE(...) TO_UNICODE_IMPL(__VA_ARGS__, "") #define MAKE_STRING(str1, ...) L#str1 TO_UNICODE(__VA_ARGS__)
- http://msdn.microsoft.com/ko-kr/library/ms177415(v=vs.100).aspx ↩