본문 바로가기
프로그래밍/C

C ] 가변인자 매크로를 활용한 디버그 로그 남기기, Predefined macros

by eteo 2022. 12. 11.

 

함수의 가변인자 함수가 있듯이 매크로에도 가변인자 매크로가 있다.

 

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

 

printlog(fmt, ...) 의 "..."이 "__VA_ARGS__"로 확장된다.

 

그리고 아래에서 __VA_ARGS__ 앞에 붙은 ##은 인수가 전혀없는 경우에 오류를 내지 않기 위해 gcc에서 도입한 표기법이다. 앞에 ##을 붙이지 않으면 인수가 전혀 없는 경우에 printf("",) 이런식으로 컴마가 붙은채로 확장되어 오류를 낼 것이다.

 

 

이런 가변인자 매크로는 디버그용 로그를 남길 때 유용하게 사용된다.

 

C언어에 미리 정의된 매크로들을 사용하여 오류가난 파일명, 라인넘버, 함수명을 알 수 있다.

 

#include <stdio.h>
#include <string.h>

#define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)

#define printlog(fmt, ...) printf("%s:%d:%s] " fmt, __FILENAME__, __LINE__, __func__, ##__VA_ARGS__);

void foo()
{
	int cnt = 10;
	printlog("Error! %d\n", cnt);
}

int main()
{
	printlog("Error!\n");
	foo();

	return 0;
}

 

 

Predefined Macros

__FILE__ 호출된 파일(경로 포함)
__func__ 호출된 함수
__LINE__ 호출된 라인
__DATE__ 컴파일한 날짜
__TIME__  컴파일한 시간