2014년 4월 15일 화요일

로그를 좀더 이쁘게 박아보자(g++ 기준)

로그를 작성할 때 그냥 막 적어도 상관은 없다만 이왕이면 해당 파일명과 소스라인 위치 함수명까지 알면 더욱 좋을것이다. 언제나 그렇듯이 긴말 말고 아래 매크로 또는 클래스들을 보자.
  • __FILE__ : 소스코드가 포함된 파일 이름을 반환
  • __LINE__ : 소스코드의 줄 번호를 반환
  • __func__ : 소스코드가 포함된 함수 이름을 반환
  • __PRETTY_FUNCTION__ : 소스코드가 포함된 클래스 이름과 함수 이름을 '이쁘게' 반환
  • typeid(T t).name() : 맹글링된 클래스 이름이나 타입 이름을 반환
다시 말하지만 위 매크로들은 g++ 기준이다. MSVCclang에서는 이와 같거나 다른 이름을 가지지만 같은 역할을 하는 매크로가 있을 것이다. 아래는 위 매크로를 이용한 간단한 예제이다.


  1 #include <iostream>
  2 #include <typeinfo>
  3
  4
  5 class CPrettyLog
  6 {
  7 public:
  8     void Print(void)
  9     {
 10         std::cout
 11             << "__PRETTY_FUNCTION__ = " << __PRETTY_FUNCTION__ << std::endl
 12             << "__func__ = " << __func__ << std::endl
 13             << "__LINE__ = " << __LINE__ << std::endl
 14             << "__FILE__ = " << __FILE__ << std::endl
 15             << "typeid(this).name() = " << typeid(this).name() << std::endl
 16             << std::endl;
 17     }
 18 };
 19
 20
 21 void Print(void)
 22 {
 23     std::cout
 24         << "__PRETTY_FUNCTION__ = " << __PRETTY_FUNCTION__ << std::endl
 25         << "__func__ = " << __func__ << std::endl
 26         << "__LINE__ = " << __LINE__ << std::endl
 27         << "__FILE__ = " << __FILE__ << std::endl
 28         << std::endl;
 29 }
 30
 31
 32 int main(int argc, char** argv)
 33 {
 34     CPrettyLog pl;
 35     pl.Print();
 36
 37     Print();
 38
 39     std::cout
 40         << "__PRETTY_FUNCTION__ = " << __PRETTY_FUNCTION__ << std::endl
 41         << "__func__ = " << __func__ << std::endl
 42         << "__LINE__ = " << __LINE__ << std::endl
 43         << "__FILE__ = " << __FILE__ << std::endl
 44         << std::endl;
 45
 46     return 0;
 47 }
 48

위 예제를 컴파일 후 실행하면 아래와 같은 결과를 얻을 수 있다.


__PRETTY_FUNCTION__ = void CPrettyLog::Print()
__func__ = Print
__LINE__ = 13
__FILE__ = main.cpp
typeid(this).name() = P10CPrettyLog

__PRETTY_FUNCTION__ = void Print()
__func__ = Print
__LINE__ = 26
__FILE__ = main.cpp

__PRETTY_FUNCTION__ = int main(int, char**)
__func__ = main
__LINE__ = 42
__FILE__ = main.cpp


댓글 없음:

댓글 쓰기