티스토리 뷰
유닉스, 리눅스 상에서 프로그래밍을 하다 보면, 디버그나 로그를 위해 메시지를 남겨야 할 경우가 빈번하다.
이 때, 사용해 볼 수 있는 간단한 팁이다. 이는 10여 년 전부터 사용해 오던 매크로(macro) 이다. 출력 파일로는 표준 출력(stdout)과 표준 에러(stderr)을 사용하였고, 이를 실제 파일로 리다이렉션(또는 dup() 등)하여 사용할 수 있을 것이다.
시간관련 포맷팅을 위해 strftime() 함수를 사용한 것과, __FILE__, __LINE__, __func__ 및 __VA_ARGS__를 사용한 것이 특징이다.
사용법? 아래 코드를 debug.h로 저장했다고 가정하자.
// exam.c
#inlcude "debug.h"
int main()
{
DEBUG("Hello World %d\n", 2014); // 일반적인 printf 함수의 포맷스트링을 사용
return 0;
}
//-- debug.h -------------------------------------------
#include <stdio.h>
#include <time.h>
// format is a string like as "%d %s..."
#define DEBUG(format, ...) do {\
time_t tm_time;\
struct tm *st_time; \
char buff[1024]; \
time( &tm_time);\
st_time = localtime( &tm_time);\
strftime( buff, 1024, "DEBUG %Y-%m-%d %H:%M:%S", st_time);\
fprintf(stderr, "%s:%s:%d:%s():" format "\n", buff,__FILE__, __LINE__, __func__, ##__VA_ARGS__);}while(0)
#define INFO(format, ...) do {\
time_t tm_time;\
struct tm *st_time; \
char buff[1024]; \
time( &tm_time);\
st_time = localtime( &tm_time);\
strftime( buff, 1024, "DEBUG %Y-%m-%d %H:%M:%S", st_time);\
fprintf(stderr, "%s:%s:%d:%s():" format "\n", buff,__FILE__, __LINE__, __func__, ##__VA_ARGS__);}while(0)
#define WARN(format, ...) do {\
time_t tm_time;\
struct tm *st_time; \
char buff[1024]; \
time( &tm_time);\
st_time = localtime( &tm_time);\
strftime( buff, 1024, "DEBUG %Y-%m-%d %H:%M:%S", st_time);\
fprintf(stderr, "%s:%s:%d:%s():" format "\n", buff,__FILE__, __LINE__, __func__, ##__VA_ARGS__);}while(0)
#define ERROR(format, ...) do {\
time_t tm_time;\
struct tm *st_time; \
char buff[1024]; \
time( &tm_time);\
st_time = localtime( &tm_time);\
strftime( buff, 1024, "DEBUG %Y-%m-%d %H:%M:%S", st_time);\
fprintf(stderr, "%s:%s:%d:%s():" format "\n", buff,__FILE__, __LINE__, __func__, ##__VA_ARGS__);}while(0)
// struct timeval a, b, result
// CMP <, >, ==, ...
#define TIMER_CMP(a, b, CMP) \
(((a)->tv_sec == (b)->tv_sec) ? \
((a)->tv_usec CMP (b)->tv_usec) : \
((a)->tv_sec CMP (b)->tv_sec))
#define TIMER_ADD(a, b, result) \
do { \
(result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \
(result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \
if ((result)->tv_usec >= 1000000) \
{ \
++(result)->tv_sec; \
(result)->tv_usec -= 1000000; \
} \
} while (0)
#define TIMER_SUB(a, b, result) \
do { \
(result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
(result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
if ((result)->tv_usec < 0) { \
--(result)->tv_sec; \
(result)->tv_usec += 1000000; \
} \
} while (0)
'프로그래밍Tip' 카테고리의 다른 글
[tip] CentOS libevent 2 및 tmux 설치 (0) | 2014.12.09 |
---|---|
[tools] Strike/Counter-Strike RE(Reverse Engineering) (0) | 2014.11.27 |
[Util] ELF Encryption (0) | 2014.11.27 |
Deviare quick start (0) | 2013.07.12 |
WinMain vs main 그리고 유니코드(w~) (0) | 2013.07.10 |