C, C++ 문법

가변인수 활용하기

디버그정 2012. 3. 6. 20:05

가변인수는 ...으로 표시하고 이를 받기 위해서는
따로 매크로 va_ 로 시작되는 매크로들을 사용해야 한다.
이를 이용하면 따로 입맛에 맛는 함수를 만들 수 있다.

가령 에디트 콘트롤에 문자열을 입력하고자 할때
보통
char szText[256];
wsprintfA(szText, "%d, %s\r\n", 정수, 문자열);
SetWindowTextA(hEdit, szText);
이렇게 3줄이나 걸리는데,,,,

가변 인수를 직접 사용자 정의 함수에서 조작하면
PrintOnEdit(HWND hWnd, char *lpFmt, ...) 식으로
한 줄로 깔끔하게 처리할 수 있게 된다. 활용도가 좋다.

아래는 로그 에디트에 출력하는 예.
int LogText(LPCSTR lpFmt, ...)  // stdcall로 선언하면 안된다.
{
  int res;
 char szText[1024];  // 충분한 버퍼 크기를 준다.
 int lenLog, len;

 // 가변 인수 처리
 va_list vlArgs;
 va_start(vlArgs, lpFmt);
 res = vsprintf(szText, lpFmt, vlArgs);
 va_end(vlArgs);
 if (!res) return 0;

 // 문자열 길이를 계산하고 최대 길이보다 크면 로그 에디트를 비워준다.
 lenLog = SendMessageA(g_hLog, WM_GETTEXTLENGTH, 0, 0);
 len = lstrlenA(szText);
 if (lenLog + len > 30000) // 30000자가 넘으면 깨끗이 지워준다.
 { 
  //LogSave(); 파일로 저장하고자 할 때
  SendMessageA(g_hLog, WM_SETTEXT, 0, (long)"");
  lenLog = 0;
 }

 // 커서를 에디트의 끝에 이동시키고 문자열을 붙인다.
 SendMessageA(g_hLog, EM_SETSEL, lenLog, lenLog);   // 커서를 맨 끝으로 이동
 SendMessageA(g_hLog, EM_REPLACESEL, 0, (LPARAM)szText);  // 문자열을 붙여준다.
 return len;
}