본문 바로가기
▶ 프로그래밍 [Programming]/▷ C 언어 [C Language]

[C 언어] 가변 인자를 이용한 디버그 함수 만들기 (va_list, va_start, va_end, vsprintf)

by (๑′ᴗ‵๑) 2021. 11. 26.
반응형

 

 

안녕하세요,

 

오늘은 가변 인자를 이용한 디버그 함수를 만드는 방법과 사용 예시에 대해 포스팅 해보도록 하겠습니다.

 

 

가변 인자

 

가변 인자를 이용하면 사용자가 입력 파라미터에 구애없이 사용자 정의 함수를 만들 수 있는 장점이 있습니다.

 

가변 인자를 이용하기 위해선  va_list, va_arg, va_start, va_end, ... 등의 타입이 필요한데요, 이는 C에서는 stdarg.h, C++에서는 cstdarg에 정의되어있습니다.

 

C 언어를 이용해 실제 실무에서 많이 사용되는 가변 인자를 이용한 사용자 정의 디버그 함수 예시를 보여드리겠습니다.

 

 

사용자 정의 출력 함수 (디버그 함수) 예시

 

예시 #1

#include <stdarg.h>
#include <stdio.h>
typedef enum
{
    DBG_NONE,
    DBG_ERROR,
    DBG_WARNING,
    DBG_NOTICE,
    DBG_INFO,
    DBG_DEBUG,
    DBG_TRACE,
    DBG_VERBOSE,
    DBG_END
} DEBUG_LEVEL;

// Debug level is DBG_DEBUG
DEBUG_LEVEL debug_level = DBG_DEBUG;
void debug_print(DEBUG_LEVEL, char *, ...);
int main()
{
    debug_print(DBG_ERROR, "DBG_ERROR print\n");
    debug_print(DBG_WARNING, "DBG_WARNING print\n");
    debug_print(DBG_NOTICE, "DBG_NOTICE print\n");
    debug_print(DBG_INFO, "DBG_INFO print\n");
    debug_print(DBG_DEBUG, "DBG_DEBUG print\n");
    debug_print(DBG_TRACE, "DBG_TRACE print\n");
    debug_print(DBG_VERBOSE, "DBG_VERBOSE print\n");
}

void debug_print(DEBUG_LEVEL lv, char *pStr, ...)
{
    if (debug_level < lv)
        return;

    // stack pointer for the variadic argument list
    va_list list;
    char buf[1024];

    // Set the pointer of the first variadic argument
    va_start(list, pStr);

    // Put the output in the buffer with the variadic argument list
    vsprintf(buf, pStr, list);
   
    // Initialize the stack pointer as NULL
    va_end(list);

    printf(pStr);
}
 
결과
DBG_ERROR print
DBG_WARNING print
DBG_NOTICE print
DBG_INFO print
DBG_DEBUG print

 

디버그 레벨을 이용해 원하는 레벨까지만 출력하도록 하는 함수입니다. 현재 디버그 레벨이 DBG_DEBUG 이므로 DBG_TRACE와 DBG_VERBOSE에 대해서는 출력되지 않는 것을 볼 수 있습니다.

 
반응형
 
예시 #2처럼 디버그 함수뿐만 아니라 사용자가 원하는 형식으로 출력하도록 구현해도 상관 없습니다.

 

예시 #2

#include <stdarg.h>
#include <stdio.h>

void bob_says(char *, ...);
int main()
{
    bob_says("Hello");
    bob_says("Nice to meet you");
}

void bob_says(char *pStr, ...)
{
    // stack pointer for the variadic argument list
    va_list list;
    char buf[1024];

    // Set the pointer of the first variadic argument
    va_start(list, pStr);

    // Put the output in the buffer with the variadic argument list
    vsprintf(buf, pStr, list);
   
    // Initialize the stack pointer as NULL
    va_end(list);

    printf("Bob: \"%s\" \n", pStr);
}  
 

결과

Bob: "Hello"
Bob: "Nice to meet you"

 

 

지금까지 가변 인자를 이용한 디버그 함수를 만드는 방법과 사용 예시였습니다.

 

읽어주셔서 감사합니다.

 

반응형

댓글