가변인자 함수

1. 가변인자 함수 설명 
 va_list
가변 인자들의 시작 주소를 저장하는 자료형
 va_start
가변 인자의 시작 주소를 va_list 형의 변수에 저장하는 매크로
 va_arg
가변 인자를 접근하는 매크로
 va_end
가변 인자 시작 주소를 NULL로 설정하는 매크로


2. 가변인자 함수의 제약

하나 이상의 고정 인자를 필요로 한다.
va_arg()를 이용하여 접근하는 가변인수는 순차적으로만 접근 가능하다.
정확한 자료형으로 접근하는 것은 전적으로 사용자의 몫
가변인수의 목록은 원형이 없기 때문에 가변인수로 전달되는 값은 인수 확장이 발생한다. (argument promotion)
int 형보다 작은 
char, short -> int
float ->  double
인수 확장이 일어난 인수는 va_arg()로 접근할 때 확장된 자료형으로 접근해야 한다.


3. 필요 라이브러리 
 #include <stdarg.h>


예제 


1. 메크로 선언


디버깅 메시지를 호출하는 파일, 함수, 위치에 정보를 넘겨주기 위한 메크로 함수
그리고, 디버깅 메시지에 색깔을 주기 위한 컬러 프린트 메크로 함수
 
#define DebugPrint(n, fp, ...) \
                   DebugPrintFunc(n, fp, __FILE__, __func__, __LINE__, __VA_ARGS__)

#define cprintf(color,fmt, args...) ({ \
        printf(color fmt ANSI_FG_NC, ##args); \
        })


2. 실제 함수 선언


int DebugPrintFunc(int , const char* , const char* filename,
          const char* funcname, int line,  const char *, ...);



3. 실제 함수 정의

    
int DebugPrintFunc(int run_level, const char* thread, const char* DebugFile, 
                  const char* DebugFunc, int DebugLine,  const char *errorMsg, ...)
{
    char buf[STD_BUF+1];
    va_list ap;

    va_start(ap, errorMsg);
    vsnprintf(buf, STD_BUF, errorMsg, ap);
    buf[STD_BUF] = '\0';

    cprintf(YELLOW,"[FATAL_ERROR] %s:%s:%d:%s",
                 DebugFile, DebugFunc, DebugLine, buf );

    va_end(ap);
}



4. 함수 호출 

DebugPrint(DEBUG_ERROR, thread_name, "Alloc Fail..Not Enough Memory\n");


Posted by KT한
,