프로그래밍을 하다 보면 로그를 남기는 경우가 많습니다. 로그를 남길 때 파일명, 라인, 함수명을 같이 기입하면 나중에 디버깅할 때 편리하죠. 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




[다운로드]

log_test.zip




[참고사항]

일부 컴파일러에서는 __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__); }