가변인자 함수
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");
'IT 생활 > 프로그래밍' 카테고리의 다른 글
[프로그래밍] 소스 자동 빌드 관리 툴 - 젠킨스(허드슨) 플러그인 활용 (2) | 2012.09.21 |
---|---|
[프로그래밍/C] 다양한 형식의 printf문 정렬 방법 (0) | 2012.07.12 |
[프로그래밍] C언어 함수 포인터 활용하기! 어렵지 않아요~ (0) | 2012.04.30 |
[프로그래밍] boyer-moore 알고리즘(패턴 매칭 알고리즘) (0) | 2011.12.19 |
[프로그래맹] 정규표현식(Regular Expression) - 상급 (0) | 2011.12.02 |