[C++] __VA_ARGS__ 를 유니코드로 변경하기

대충 요약해서 아래와 같은 매크로가 있었다.


#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__)
  1. http://msdn.microsoft.com/ko-kr/library/ms177415(v=vs.100).aspx

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다