Total Articles 494
프로그래밍을 하다 보면 로그를 남기는 경우가 많습니다. 로그를 남길 때 파일명, 라인, 함수명을 같이 기입하면 나중에 디버깅할 때 편리하죠. C/C++ 에서는 다음과 같은 preprocessor를 사용하여 이러한 요구를 구현할 수 있습니다. C++ 개발자 중에 의외로 이러한 팁을 모르는 사람이 많아 정리해 놓습니다.
#define MYDEBUG(fmt, ...) { printf("[%s:%d] %s "fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); }
[예제코드]
#include <stdio.h>#define MYDEBUG(fmt, ...) { printf("[%s:%d] %s "fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); }int main(){printf("hello world\n");MYDEBUG("hello world\n");}
[실행결과]
hello world
[main.cpp:9] main hello world
[다운로드]
[참고사항]
일부 컴파일러에서는 __FILE__ 이 full path를 반환해 주는 경우가 있음.
일부 컴파일러에서는 __FUNCTION__ 이 class name을 포함하는 경우가 있음.
[github]
https://github.com/gilgil1973/vdream90/blob/master/include/log/vlog.h
#define LOG_DEBUG(fmt, ...) { VLog* log = getLog(); if (log != NULL && log->level <= VLog::LEVEL_DEBUG) log->debug("[%s:%d] %s "fmt, __FILENAME__, __LINE__, __FUNCNAME__, ##__VA_ARGS__); } | |
#define LOG_INFO(fmt, ...) { VLog* log = getLog(); if (log != NULL && log->level <= VLog::LEVEL_INFO ) log->info ("[%s:%d] %s "fmt, __FILENAME__, __LINE__, __FUNCNAME__, ##__VA_ARGS__); } | |
#define LOG_WARN(fmt, ...) { VLog* log = getLog(); if (log != NULL && log->level <= VLog::LEVEL_WARN ) log->warn ("[%s:%d] %s "fmt, __FILENAME__, __LINE__, __FUNCNAME__, ##__VA_ARGS__); } | |
#define LOG_ERROR(fmt, ...) { VLog* log = getLog(); if (log != NULL && log->level <= VLog::LEVEL_ERROR) log->error("[%s:%d] %s "fmt, __FILENAME__, __LINE__, __FUNCNAME__, ##__VA_ARGS__); } | |
#define LOG_FATAL(fmt, ...) { VLog* log = getLog(); if (log != NULL && log->level <= VLog::LEVEL_FATAL) log->fatal("[%s:%d] %s "fmt, __FILENAME__, __LINE__, __FUNCNAME__, ##__VA_ARGS__); } | |
#define LOG_TRACE(fmt, ...) { VLog* log = getLog(); if (log != NULL) log->trace("[%s:%d] %s "fmt, __FILENAME__, __LINE__, __FUNCNAME__, ##__VA_ARGS__); } | |