C++打印類名+函數名的方法

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__
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章