'가변 인자 함수'에 해당되는 글 2건

  1. 2010.08.31 가변 인자 함수 2
  2. 2010.08.31 가변 인자 함수 1

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

출처 : http://blog.paran.com/mk3358/12232583 (원 출처가 폐쇄되어 링크를 대신합니다.)

 

어떤 함수의 경우에는 인자의 타입 검사를 생략하는 경우가 있다.

C의 printf()와 같이 함수의 인자 개수가 일정하지 않은 가변 인자 함수가 그렇다.

이 함수의 원형은 아래와 같다.


int printf( const char *format, ... );


이 함수의 마지막 인자처럼 생략부호(...)로 적어주면

가변 인자 함수(variadic function)를 나타낸다(생략부호 앞의 콤마는 생략해도 된다).

가변 인자 함수는 인자가 정확히 몇 개 오는지 또 어떤 타입인지 알 수 없기 때문에 타입 검사를 할 수 없다.

그래서 printf() 함수 사용은 전적으로 사용자 책임이다.

다음 예와 같이 엉뚱한 사용으로 돌아오는 결과는 실행 시간에 치명적인 에러로 나타난다.


int a = 10 ;
printf( '%d, %f, %dd, %s', a ) ;


참고적으로 가변 인자 함수를 정의하는 절차에 대해 소개한다.


① 우선 stdarg.h 헤더 파일을 포함한다.


#include <stdarg.h>

 

② 가변 인자 함수의 원형을 정한다.

가변 인자 함수에서 마지막 인자는 생략부호, 첫번째 인자는 보통의 인자로 선언해야 한다.

예로 임의 개수의 실수 합을 구하는 함수 sum()을 정의해 보자. 첫 인자는 가변 인자의 수를 넘긴다.

double sum( int n... ) ; 또는 double sum( int n, ... ) ;



③ 함수 정의 안에서 va_list 타입의 변수를 선언한다. 예를 들어 list라 하자.


va_list list ;

 list는 함수의 실인자열을 가리키는 포인터 역할을 한다.



④ va_start 매크로를 사용하여 인자열의 첫 인자를 포인터에 설정한다. va_start매크로의 첫 인자에 va_list 타입으로 선언한 변수를 넣고, 두 번째 인자는 지금 정의하는 함수의 첫 인자를 넣는다.


va_start(list,n);

 

⑤ va_arg 매크로를 사용하여 리스트에서 인자를 꺼내 쓴다. va_arg 매크로의 첫 인자는 va_list 타입으로 선언한 변수이고, 두 번째 인자는 가변 인자열의 인자 타입이다. 실수에 대한 합을 구하므로 double형을 주자.


double item = va_arg(list, double);

 

⑥ va_end 매크로를 사용하여 가변 인자열 포인터를 리셋(reset) 시킨다.


va_end(list);


 

'Programming Languages > C' 카테고리의 다른 글

가변 인자 함수 2  (0) 2010.08.31
포인터 다루기  (0) 2010.04.08
파일 입/출력  (0) 2010.03.14
재귀 함수  (0) 2010.03.09
fflush.c  (0) 2010.01.12
Posted by 독뽀
,