関数の入り口と出口でログ出力したいが、 1関数につき必ず2行以上ログのコードを入れる必要がある。 また、途中で抜けた場合など、ケアが難しいケースがある。
boost::scope_exit
boost::scope_exitを利用する。
#include <boost/scope_exit.hpp>
#define FUNC_IN_OUT_LOG \
std::cout << "begin :" << __PRETTY_FUNCTION__ << std::endl; \
std::string func = __PRETTY_FUNCTION__; \
BOOST_SCOPE_EXIT((func)) { \
std::cout << "end :" << func << std::endl; \
} BOOST_SCOPE_EXIT_END
BOOST_SCOPE_EXITマクロは変数キャプチャ機能がある。 BOOST_SCOPE_EXITで定義したスコープ内で __PRETTY_FUNCTIN__を利用すると、自動生成された構造体の シンボルがくっついてしまうため、 スコープ外で__PRETTY_FUNCTION__して変数に入れておき、 キャプチャしたものをログ出力するというところがポイントとなる。
使用例
void Foo::foo() {
FUNC_IN_OUT_LOG
...
}
result
begin : void Foo::foo()
end : void Foo::foo()
難点は例外をthrowした場合でも、スコープアウトとみなして endの出力がされてしまうところか。。。