C++ 11 (最新の GCC を使用) で、現在実行されているメソッド(呼び出し元)を呼び出しているメソッドの名前、またはファイルと行番号を取得する方法はありますか?
たとえば、次のコードが失敗した場合に、この情報をエラー メッセージで使用したいと考えています。
void SomewhereInMyProgram()
{
DoSomething(nullptr);
}
void DoSomething(const char* str)
{
Contract::Requires(str != nullptr);
// ...
}
現在、エラーが で発生していると報告するコードを用意していますDoSomething
。SomewhereInMyProgram
これは技術的には真実ですが、エラーが発生した場所でエラーが発生したことを報告したいと思います。それは私の人生をずっと楽にするでしょう!
このソリューションでは、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__ )
};