首頁  >  文章  >  後端開發  >  如何在沒有 __CLASS__ 巨集的情況下確定 C 中的類別名稱?

如何在沒有 __CLASS__ 巨集的情況下確定 C 中的類別名稱?

Barbara Streisand
Barbara Streisand原創
2024-11-07 21:09:02723瀏覽

How to Determine Class Name in C   Without __CLASS__ Macro?

確定C 中的類別名稱

C 中缺少與Python 的__CLASS__ 宏直接等效的內容,這使得開發人員尋求替代解決方案來在運行時檢索目前類別名稱。

為了滿足這一需求,開發人員設計了宏,利用各種技術從 __PRETTY_FUNCTION__ 宏提供的資訊中提取類別名稱。當巨集在類別方法中使用時,傳回一個表示完全限定方法簽章的字串,包括類別名稱、方法名稱和參數。

其中一個名為 __METHOD_NAME__ 的巨集使用 methodName 輔助函數解析 __PRETTY_FUNCTION__ 字串。它刪除了返回類型、修飾符和參數,只留下類別名稱和方法名稱。

例如:

inline std::string methodName(const std::string& prettyFunction)
{
    size_t colons = prettyFunction.find("::");
    size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
    size_t end = prettyFunction.rfind("(") - begin;

    return prettyFunction.substr(begin,end) + "()";
}

#define __METHOD_NAME__ methodName(__PRETTY_FUNCTION__)

此巨集允許開發人員輕鬆擷取非-靜態方法。但是,當在 this 指標不可用的靜態方法中使用時,開發人員必須考慮利用 __PRETTY_FUNCTION__ 巨集的替代巨集。

對於只需要類別名稱的場景,可以使用 __CLASS_NAME__ 巨集:

inline std::string className(const std::string& prettyFunction)
{
    size_t colons = prettyFunction.find("::");
    if (colons == std::string::npos)
        return "::";
    size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
    size_t end = colons - begin;

    return prettyFunction.substr(begin,end);
}

#define __CLASS_NAME__ className(__PRETTY_FUNCTION__)

此巨集同時適用於類別和靜態方法,解析 __PRETTY_FUNCTION__ 字串以有效擷取類別名稱。

以上是如何在沒有 __CLASS__ 巨集的情況下確定 C 中的類別名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn