본문 바로가기
프로그래밍 언어/c(임베디드)

가변인자 함수 + 디버깅 매크로

by [Akashic Records] 개발의선지자 2024. 8. 16.

가변인자란?

가변인자란 인자의 개수가 변하는 인자

디버깅 사용방법

가변 인자와  내장 디버깅 매크로를 지원하지 않을 때

1. gcc  컴파일러 환경에서 디버깅용 매크로 선언

printf 함수처럼  매크로도 가변 개수의 인수를 취하도록 만들 수 있다. 이를 가변 매크로(variable macro)라고 한다.

 

gcc에서 확장으로 제공하는 문법이므로 당연히 다른 컴파일러에서는 쓸 수 없습니다.
C99의 표준 문법은 #define TRACE(fmt, args...) printf("(%s[%d] : " fmt, __FUNCTION__, __LINE___, ##args);

 

2. gcc 이외 컴파일러 환경에서 디버깅용 매크로 선언

#define TRACE(fmt, ...) printf(fmt, ##__VA_ARGS__)
 

가변 인자와  내장 디버깅 매크로를 지원 시

 

1. 가변인자 함수 사용


c언어에서 가변 인자를 제어하기 위한 라이브러리를 추가하여 가변 인자를 사용

 

<stdarg.h> : 가변인자들을 제어하기 위한 라이브러리 헤더

  • va_list : 가변 인자 목록, 가변 인자의 메모리 주소를 저장하는 포인터
  • va_start : 가변 인자를 가져올 수 있도록 포인터 설정
  • va_arg : 가변 인자 포인터에서 특정 자료형 크기만큼 값 가져옴
  • va_end : 가변 인자 처리가 끝났을 때 포인터를 NULL로 초기화
#include <stdio.h>
#include <stdarg.h>

int sum(int count, ...)
{
    int res = 0;
    va_list ap;
    int i;

    va_start(ap, count);
    
    for(i=0; i<count; i++)
        res += va_arg(ap, int);

    va_end(ap);

    return res;
}

int main()
{
    printf("%d\n", sum(5, 1,2,3,4,5));

    return 0;
}

 

 

2. vsprintf / vnsprintf

 

#include <stdarg.h> : 가변인자 함수들을 사용하기 위한 라이브러리 헤더

 

int vsprintf(char *Dest, const char *Format,va_list Args);

int vsnprintf(char *Dest, size_t n, const char *Format, va_list Args);

내장 디버깅 매크로

매크로  타입 출력
__func__ %s  매크로가 호출된 함수
__LINE__ %d 매크로가 호출된 라인
__FILE %s 매크로가 출력된 파일
__DATE__ %s 매크로가 호출된 날짜
__TIME %s 매크로가 호출된 시간

 

'프로그래밍 언어 > c(임베디드)' 카테고리의 다른 글

system() / sync()  (0) 2024.11.13
Wiegand 통신  (0) 2024.09.08
구조체 & 공용체 [1]  (0) 2024.07.18
LSM/MSB , 리틀 엔디안 / 빅 엔디안  (0) 2024.07.16
while문 사용법  (0) 2024.07.13