ホームページ  >  記事  >  バックエンド開発  >  __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__ マクロによって提供される情報からクラス名を抽出するさまざまな手法を活用するマクロを考案しました。このマクロをクラス メソッド内で使用すると、クラス名、メソッド名、パラメーターを含む完全修飾メソッド シグネチャを表す文字列が返されます。

このようなマクロの 1 つ (__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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。