함수의 가변인자 함수가 있듯이 매크로에도 가변인자 매크로가 있다.
#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__ | 컴파일한 시간 |
'프로그래밍 > C' 카테고리의 다른 글
윈도우 소켓 ] Winsock 라이브러리 링크하기 (0) | 2022.12.16 |
---|---|
C/C++ ] tick / 시간 측정하기 (0) | 2022.12.14 |
전처리기 ] # 문자열화 연산자 (0) | 2022.12.09 |
C ] 빅엔디안 리틀엔디안 변환함수 구현 + 매크로 함수 작성시 주의점 (0) | 2022.10.22 |
C ] memset 함수 구현 (0) | 2022.10.09 |