C++打印類名+函數名的方法
打log的時候經常需要將輸出log時所在的類名,函數名寫清楚。
但是自己敲函數名和類名比較麻煩,複製粘貼的時候也會忘記修改而出錯。
下面介紹下如何在G++/GCC編譯器下獲得函數名和類名:
如果只想獲得函數名可以用C99的特性:
__func__
但是在成員函數中,想打出 類名::函數名 這樣的log,用上面這個宏就做不到了。
在GCC下可以利用GCC的一個擴展特性來做到,就是這貨:
__PRETTY_FUNCTION__
它能以字符串的形式返回完整的函數簽名,包括返回值、類名、函數名、參數列表、模板參數。具體功能可以自己搜索。
但是這樣還是不夠,打log的時候我們只需要函數頭,參數列表、模板參數沒有用。這個簡單:
static std::string _CutParenthesesNTail(std::string&& prettyFuncon)
{
auto pos = prettyFuncon.find('(');
if(pos!=std::string::npos)
prettyFuncon.erase(prettyFuncon.begin()+pos, prettyFuncon.end());
return std::move(prettyFuncon);
}
#define __STR_FUNCTION__ _CutParenthesesNTail(std::string(__PRETTY_FUNCTION__))
在函數裏調用_ _ STR_FUNCTION _ _這個宏就能得到函數頭了。
它去掉了括號開始後面的所有內容,只保留返回值、類名、函數名。
還可以添加上空格和冒號之類的東西:
// means function name + parentheses (P = parentheses)
#define __STR_FUNCTIONP__ __STR_FUNCTION__+"()"
// means function name + parentheses + colon (C = colon)
#define __STR_FUNCTIONPC__ __STR_FUNCTION__+"(): "
// means the head of one piece of log.
#define LOG_HEAD __STR_FUNCTIONPC__