- __FILE__ : 소스코드가 포함된 파일 이름을 반환
- __LINE__ : 소스코드의 줄 번호를 반환
- __func__ : 소스코드가 포함된 함수 이름을 반환
- __PRETTY_FUNCTION__ : 소스코드가 포함된 클래스 이름과 함수 이름을 '이쁘게' 반환
- typeid(T t).name() : 맹글링된 클래스 이름이나 타입 이름을 반환
다시 말하지만 위 매크로들은 g++ 기준이다. MSVC나 clang에서는 이와 같거나 다른 이름을 가지지만 같은 역할을 하는 매크로가 있을 것이다. 아래는 위 매크로를 이용한 간단한 예제이다.
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
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
댓글 없음:
댓글 쓰기