항상 잊을만 하면 쓸 필요가 생기는 코드.
내부적으로 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 계열 함수를 이용해 버퍼 오버런에 대응할 수 있도록 한다..