9

C++ 11 (最新の GCC を使用) で、現在実行されているメソッド(呼び出し元)を呼び出しているメソッドの名前、またはファイルと行番号を取得する方法はありますか?

たとえば、次のコードが失敗した場合に、この情報をエラー メッセージで使用したいと考えています。

void SomewhereInMyProgram()
{
    DoSomething(nullptr);
}

void DoSomething(const char* str)
{
    Contract::Requires(str != nullptr);
    // ...
}

現在、エラーが で発生していると報告するコードを用意していますDoSomethingSomewhereInMyProgramこれは技術的には真実ですが、エラーが発生した場所でエラーが発生したことを報告したいと思います。それは私の人生をずっと楽にするでしょう!

このソリューションでは、C++11 の機能、マクロ、または GCC 固有のものを使用できますが、呼び出しサイトごとに追加する必要があるものは使用しません。

例外処理を使用できないため、スタックトレースは役に立たないと思います。実際、私は非常に制限されています。これは、標準の C++ ヘッダーが利用できない独立した環境です。私はある種のマクロな解決策を望んでいました。


class Contract
{
public:
    static void RequiresImpl(bool condition, const char* expression,
        const char* file, int line);

    #define Requires(condition) RequiresImpl(condition, #condition , \
        __FILE__, __LINE__ )
};
4

3 に答える 3

6

DoSomething をマクロでラップします。

void DoSomethingImp(char const *, char const *file, char const *line)
{
    // do whatever needed, use file and line to report problems
}

#define DoSomething(x) DoSomethingImp(x, __FILE__, __LINE__)

免責事項:

これは最善の方法ではありません。ANSI または UNICODE のいずれかに対して、この方法で定義された WIN API マクロについて、人々は悲鳴を上げています。しかし、DoSomething へのすべての呼び出しを変更したくない場合は、これが唯一の方法だと思います。

于 2013-04-08T17:28:41.950 に答える
-4

gcc では、次のマクロのいずれかを使用できます:__PRETTY_FUNCTION__または__FUNCTION__または__func__.

于 2013-04-08T17:59:59.137 に答える