출처 : 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
Posted by 독뽀
,