C ++ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рд▓реЙрдЧрд░


рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ " рдХреНрдпрд╛ рдХреЛрдб рдЯреНрд░рд┐рдХреНрд╕ рдкрддрд╛ рд╣реИ? " рд╡рд┐рд╖рдп рд╕реЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдореИрдВ рдЗрд╕ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЛ рд╡рд╣рд╛рдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд▓реЗрдЦрдХ рдиреЗ "рдХрдЯреНрдЯрд░рддрд╛ рдХреЗ рдмрд┐рдирд╛" рдкреВрдЫрд╛, рдФрд░ рдРрд╕реА рддрд░рдХреАрдмреЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдордЭрдиреЗ рдореЗрдВ рдкрд╛рдБрдЪ рд╕реЗ рджрд╕ рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд▓рдЧреЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕ рддрд░рд╣ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗред

рдПрдХ рдЫреЛрдЯрд╛, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╡рд░реНрдЧ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рд╕рд╛рде рд╣реА рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪрд╛рд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╕реАрдзреЗ рдХреЙрд▓ рд╕реНрдЯреИрдХрдЖрдЙрдЯ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдмреЗрд╢рдХ, рдкрдЪреНрдЪрд░ рд╕реНрдЯрдбрдЖрдЙрдЯ рдореЗрдВ рдирд╣реАрдВ рдЬреБрдЯрд╛ рдерд╛, рдФрд░ рдЖрдк рдХрдо рд╕реЗ рдХрдо рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо рдХрд╣реАрдВ рдФрд░ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред

рддреБрд░рдВрдд рд╕рд╣рдордд:
  1. рд╕реНрдереВрд▓ рджреБрд░реБрдкрдпреЛрдЧ рдмреБрд░рд╛рдИ рд╣реИ
  2. рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреБрдЫ рднреА рдирдпрд╛ рдФрд░ рдЕрд▓реМрдХрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ (рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)
  3. рдпрд╣ рддрдХрдиреАрдХ рдмрд╣реБ-рд╕реВрддреНрд░рд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрдо рдЙрдкрдпреЛрдЧ (рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ) рдХреА рд╣реИ
  4. рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд╣реА, рдкреВрд░реНрдг рдФрд░ рдЕрдзрд┐рдХ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
  5. рдпрд╣ рддрдХрдиреАрдХ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдбрд┐рдмрдЧрд░ рдХреЛ рдкреВрд░рдХ рдХрд░рддреА рд╣реИ

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╕рдордп рдЖрдкрдиреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкреНрд░рд┐рдВрдЯрдл ("рдПрдВрдЯрд░рд┐рдВрдЧ рдлреВ () \ n") рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрд╛ рд╣реЛ; рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреЛ рдЖрдк рд╕рд┐рд░реНрдл рдкрддреЗ рдкрд░ рдЖрдПред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдмрд╣реБрдд рд╣реА рдкреНрд░рд┐рдВрдЯ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ ("рдПрдВрдЯрд░рд┐рдВрдЧ рдлреВ () \ n") рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдирд┐рдЪреЛрдбрд╝реЗрдВред рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ, рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдореИрдХреНрд░реЛ __FUNCTION__ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдпрд╛рдиреА рдХрд╛рд╕реНрдЯ рд╢рд╛рд░реНрдк) рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлреНрд░реЗрдорд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд╣реЛрддрд╛ рд╣реИ:

printf("Entering %s()\n", __FUNCTION__); 


рдФрд░ рдХреЛрдб рдХреЛ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░рдХ рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЗрд╕ рдмрд╛рдд рдХреЛ рдореИрдХреНрд░реЛ рдХреЗ рддрд╣рдд рдЫрд┐рдкрд╛рдПрдВ:

 #define LOG_TRACE printf("Entering %s()\n", __FUNCTION__); 


рдЕрдм, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреВрдбрд▓-рдЬреИрд╕реЗ рдХреЛрдб рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ LOG_TRACE рдореИрдХреНрд░реЛ рдХреЛ рд░рдЦреЗрдВ, рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИ:
 #include <stdio.h> #define LOG_TRACE printf("Entering %s()\n", __FUNCTION__); void abc() { LOG_TRACE } void foo() { LOG_TRACE abc(); } void bar() { LOG_TRACE foo(); abc(); } int main(int argc, char* argv[]) { bar(); return 0; } 

рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░, рдХрдВрд╕реЛрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛
 Entering bar() Entering foo() Entering abc() Entering abc() 


рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫред рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ __FUNCTION__ рдореИрдХреНрд░реЛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдХрдо рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдореИрдХреНрд░реЛрдЬрд╝ __FILE__ рдФрд░ __LINE__ рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 #define LOG_TRACE printf("Entering %s() (%s:%d)\n", __FUNCTION__, __FILE__, __LINE__); 

 Entering bar() (main.cpp:23) Entering foo() (main.cpp:18) Entering abc() (main.cpp:14) Entering abc() (main.cpp:14) 


рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░ - рдЖрдк рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реИред

рд╣рдо рдкреВрдВрдЫ рджреНрд╡рд╛рд░рд╛ рдмрд┐рд▓реНрд▓реА рдХреЛ рдирд╣реАрдВ рдЦреАрдВрдЪреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рди рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ, рдмрд▓реНрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдирд┐рдХрд╛рд╕ рднреА рд▓реЙрдЧ рд╣реЛред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдо рдПрдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдЫреЛрдЯреЗ рдмрд┐рд╢рдк рдХреЗ рд╕рд╛рде рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд▓рд╕-рдЖрдХрд╛рд░ рдХреА рд╕рдВрддрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рдЬрдм рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди (рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рджрд╛рдпрд░реЗ) рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╕реНрдЯреИрдХ рдХреЛ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди (рдЧреБрдВрдЬрд╛рдЗрд╢) рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЗрд╕реЗ рдХреНрдпрд╛ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдлрд╛рдИ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЧреБрдВрдЬрд╛рдЗрд╢ рдЫреЛрдбрд╝рдиреЗ рдкрд░ рд╕реНрдЯреИрдХ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рдирд╛рд╢ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд╡рд┐рдирд╛рд╢рдХреЛрдВ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдЕрдм рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рди рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рднреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдП TraceLogger рдХреНрд▓рд╛рд╕ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛, рдФрд░ рдЦреБрд╢реА рд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ред

TraceLogger.h:
 class TraceLogger { public: TraceLogger(const char* fileName, const char* funcName, int lineNumber); ~TraceLogger(); private: const char* _fileName; const char* _funcName; }; #define LOG_TRACE TraceLogger traceLogger(__FILE__, __FUNCTION__, __LINE__); 


рдЕрдм рдореИрдХреНрд░реЛ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВрдЧреЗ - рд╡реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЦреБрдж рдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕ рдЕрд╡рдзрд┐ рдХреЗ рджреМрд░рд╛рди рд╣реИ рдХрд┐ рддрд╛рд░ рд░рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ __FILE__ рдФрд░ __FUNCTION__ рдореИрдХреНрд░реЛрдЬрд╝ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

TraceLogger.cpp:
 TraceLogger::TraceLogger(const char* fileName, const char* funcName, int lineNumber) { _fileName = fileName; _funcName = funcName; std::cout << "Entering " << _funcName << "() - (" << _fileName << ":" << lineNumber << ")" << std::endl; } TraceLogger::~TraceLogger() { std::cout << "Leaving " << _funcName << "() - (" << _fileName << ")" << std::endl; } 


рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖, рддрджрдиреБрд╕рд╛рд░, рдпрд╣ рд╣реИ:

 Entering bar() - (main.cpp:19) Entering foo() - (main.cpp:14) Entering abc() - (main.cpp:10) Leaving abc() - (main.cpp) Leaving foo() - (main.cpp) Entering abc() - (main.cpp:10) Leaving abc() - (main.cpp) Leaving bar() - (main.cpp) 


рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдХрд╛рд╢, рдореИрдВ рдЗрд╕реЗ рдЗрдВрдбреЗрдВрдЯ рдХрд░ рд╕рдХрддрд╛ рдерд╛!" рдореЗрд░реА рдЬреАрдн рдореЗрдВ рдШреВрдорддреА рд╣реИ, рд╣реИ рдирд╛? рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ! рд╣рдо рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдп рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрдВрдбреЗрдВрдЯ рд▓рд╛рдЗрди (рд▓рдЧрднрдЧ рдХрдИ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди) рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рдо рдЗрд╕реЗ рд▓реЙрдЧ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп (рдЬрдм рдЖрдк рдЕрдЧрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ), рд╣рдо рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдмрдврд╝рд╛рдПрдВрдЧреЗ, рдФрд░ рдЬрдм рдпрд╣ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ), рд╣рдо рдЗрд╕реЗ рдХрдо рдХрд░ рджреЗрдВрдЧреЗред

TraceLogger.h:
 class TraceLogger { ... private: ... static std::string Indent; }; 


TraceLogger.cpp:
 std::string TraceLogger::Indent; TraceLogger::TraceLogger(const char* fileName, const char* funcName, int lineNumber) { _fileName = fileName; _funcName = funcName; std::cout << Indent << "Entering " << _funcName << "() - (" << _fileName << ":" << lineNumber << ")" << std::endl; Indent.append(" "); } TraceLogger::~TraceLogger() { Indent.resize(Indent.length() - 2); std::cout << Indent << "Leaving " << _funcName << "() - (" << _fileName << ")" << std::endl; } 


рдФрд░ рдЕрдм рд╣рдорд╛рд░рд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 Entering bar() - (main.cpp:19) Entering foo() - (main.cpp:14) Entering abc() - (main.cpp:10) Leaving abc() - (main.cpp) Leaving foo() - (main.cpp) Entering abc() - (main.cpp:10) Leaving abc() - (main.cpp) Leaving bar() - (main.cpp) 


рд╣реБрд░реНрд░реЗ! рдЕрдм, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рднреА рд╕рдордп, рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдХрд┐рд╕ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╣реИрдВ рдФрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдВ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪреЗред рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдХреБрдЫ рдЧрд┐рд░ рдЧрдпрд╛, рддреЛ рдЖрдк рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣рд╛рдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬреАрдбреАрдмреА рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдЙрд╕реЗ рдХреНрд░рд╕реНрдЯ рдЦрд┐рд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ)ред

рдФрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдмреЗрд╢рдХ, рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрд╕ рд╕рднреА рдЧрдбрд╝рдмрдбрд╝ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ:

TraceLogger.h:
 ... #ifdef DEBUG #define LOG_TRACE TraceLogger logger(__FILE__, __FUNCTION__, __LINE__); #else #define LOG_TRACE #endif 


рдФрд░ рдЕрдм рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рднреА LOG_TRACE рдХреЙрд░реНрди рдЦрд╛рд▓реА рд╣реИрдВред рдФрд░ рдмрд╛рдЗрдирд░реА рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреВрд░реА рдХрдХреНрд╖рд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдЯ рднреА рд╕рдХрддреЗ рд╣реИрдВ, рдШреЛрд╖рдгрд╛ рдФрд░ #ifdef DEBUG рдХреЗ рдкреАрдЫреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЛрдиреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реБрдП - рдореИрдВ рдЖрдкрдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреА рддрд░рд╣, рд╡реЗ рднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВред

рд╡рд╣ рд╕рдм рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдЧрд╛ред

рд╣реИрдкреНрдкреА рдХреЛрдбрд┐рдВрдЧ!

Source: https://habr.com/ru/post/In148781/


All Articles