Win32 , C++

가변 인자 처리 샘플

김모작자 2007. 6. 29. 18:45

항상 잊을만 하면 쓸 필요가 생기는 코드.

내부적으로 trace 를 구현할 때 참 유용하다.
특히 MFC 의 TRACE 는 유니코드 문자열을 지원하지 못하기 때문에 MFC 로 유니코드 어플리케이션을 만들때 急 필요한 코드 조각이다.

기왕이면 아래 1024 바이트를 스택에 만드는 것보다 스레드 별로 TLS 를 만드는 편이 더 낫겠다는 생각이 글 쓰면서 들었다 -_-

// 1. 일반적인 코딩
void _DBGTRACE(TCHAR* format, ...)
{
       TCHAR buf[1024];
       va_list        marker;
       va_start(marker, format);
       _vstprintf(buf, format, marker);
       va_end(marker);

       OutputDebugString(buf);
}

// 2. 안전+LFH힙을 이용한 문자열 포맷팅
 LPCTSTR HFormat(LPCTSTR format, ...)
 {
  va_list        marker;
  va_start(marker, format);

  int len = _vsctprintf( format, marker ) + 1;
  LPTSTR buf = (LPTSTR)Alloc(len);
  _vstprintf_s(buf, len, format, marker);

  va_end(marker);

  return buf;
 }

문자열의 경우 LFH(Low Fragment Heap) 을 사용하면 이득을 볼 수 있기 때문에 Alloc 에 해당하는 함수에서 적절히(?) 처리해주고.. _s 계열 함수를 이용해 버퍼 오버런에 대응할 수 있도록 한다..