출처 : http://wiki.kldp.org/wiki.php/CLanguageVariableArgumentsList
본문보다 더 자세하게 나와있으니 부족한 부분은 출처를 통해 정보를 얻으시기 바랍니다.
이번에는 가변인자함수를 이용해서 printf()와 똑같은 wrapper함수를 작성해 보도록 하자.
int my_printf(const char *fmt, ...)
{
va_list argptr;
int ret;
va_start(argptr, fmt);
ret = vprintf(fmt, argptr);
va_end(argptr);
return ret;
}
이해가 되었다면 간단한 디버깅함수로서 아래와 같은 함수도 만들수 있겠다.
void error(int status, int ecode, const char *fmt, ...)
{
va_list argptr;
fflush(stdout);
fprintf(stderr, 'error: ');
if (ecode)
fprintf(stderr, '%s: ', strerror(ecode));
va_start(argptr, fmt);
vfprintf(stderr, fmt, argptr);
va_end(argptr);
fputc('\n', stderr);
fflush(stderr); /* redundant */
if (status)
exit(status);
}
에러발생시 에러코드값을 표준에러(stderror)로 출력하며, status값에 따라 프로그램을 종료할 수도 있다.
한편, 커널소스에서 종종 보던 가변인자를 이용한 매크로함수도 구현이 가능하다.
(단, ISO C표준을 지원하는 컴파일러에서만 가능함)
#define debug(s, ...) fprintf(stderr, s, __VA_ARGS__)
void foo(void)
{
debug('Entered the function, %s\n', __func__);
/* ... */
}
'Programming Languages > C' 카테고리의 다른 글
가변 인자 함수 1 (0) | 2010.08.31 |
---|---|
포인터 다루기 (0) | 2010.04.08 |
파일 입/출력 (0) | 2010.03.14 |
재귀 함수 (0) | 2010.03.09 |
fflush.c (0) | 2010.01.12 |