가변인수는 ...으로 표시하고 이를 받기 위해서는
따로 매크로 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;
}
'C, C++ 문법' 카테고리의 다른 글
sprintf(swprintf, _stprintf) 함수에서 실수 문자열 표현시 주의 (0) | 2012.10.24 |
---|---|
c의 qsort와 stl의 sort에서 비교 함수(또는 함수객체) 사용시 결과값 세팅 주의 (0) | 2012.10.22 |
연산자 순위 헷갈리는 것 (0) | 2012.10.19 |
대소문자 구별 없이 소스 문자열에서 특정 문자열 찾기 (0) | 2012.03.05 |
문자열 입력시 헥스 문자열을 통해 헥스 값을 그대로 입력시키고자 할 때 알아두면 좋은 tip! (0) | 2012.03.01 |
헥스 문자열과 값의 상호 변환 (0) | 2011.07.25 |
비트 연산으로 산술연산 빠르게 처리하기 (1) | 2011.07.24 |