web-dev-qa-db-ja.com

assertにカスタムメッセージを追加しますか?

Assertによってスローされたメッセージを追加または編集する方法はありますか?次のようなものを使用したい

assert(a == b, "A must be equal to B");

次に、コンパイラはlinetimeなどを追加します...

出来ますか?

111
Killrazor

私が周りで見たハックは、&&演算子。ポインターがヌルでない場合、ポインターは「true」であるため、条件を変更せずに以下を実行できます。

assert(a == b && "A is not equal to B");

assertは失敗した状態を示しているため、メッセージも表示されます。十分でない場合は、必要なものを表示する独自のmyAssert関数またはマクロを作成できます。

209
zneak

別のオプションは、オペランドを逆にしてコンマ演算子を使用することです。コンマが引数間の区切り文字として扱われないように、追加の括弧が必要です。

assert(("A must be equal to B", a == b));

(これは、見やすくするために上記のコメントからコピーされました)

37
Andrei Bozantan

メッセージを受け取り、すべてを明確な方法で出力するassertマクロの私のバージョンは次のとおりです。

#include <iostream>

#ifndef NDEBUG
#   define M_Assert(Expr, Msg) \
    __M_Assert(#Expr, Expr, __FILE__, __LINE__, Msg)
#else
#   define M_Assert(Expr, Msg) ;
#endif

void __M_Assert(const char* expr_str, bool expr, const char* file, int line, const char* msg)
{
    if (!expr)
    {
        std::cerr << "Assert failed:\t" << msg << "\n"
            << "Expected:\t" << expr_str << "\n"
            << "Source:\t\t" << file << ", line " << line << "\n";
        abort();
    }
}

今、あなたはこれを使用することができます

M_Assert(ptr != nullptr, "MyFunction: requires non-null argument");

失敗した場合は、次のようなメッセージが表示されます。

アサート失敗:MyFunction:null以外の引数が必要

期待:ptr!= nullptr

ソース:C:\ MyProject\src.cpp、22行目

きれいで、コードで自由に使用してください=)

19
BOOST_ASSERT_MSG(expre, msg)

http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html

それを直接使用するか、Boostのコードをコピーすることができます。また、Boost assertはヘッダーのみであるため、Boostのすべてをインストールしたくない場合は、その単一のファイルを取得することもできます。

18
Zero

Zneakの答えはコードをいくらか畳み込むので、より良いアプローチは、あなたが話している文字列テキストを単にコメントすることです。すなわち:

assert(a == b); // A must be equal to B

アサートエラーのリーダーは、エラーメッセージからファイルと行を検索するため、ここで完全な説明が表示されます。

なぜなら、一日の終わりに、これは:

assert(number_of_frames != 0); // Has frames to update

これよりも読みやすい:

assert(number_of_frames != 0 && "Has frames to update");

コードの人間の解析の観点から読みやすさ。言語ハックでもありません。

7
metamorphosis

assertはマクロ/関数の組み合わせです。 __FILE____BASE_FILE____LINE__などを使用して、カスタムメッセージを受け取る独自の関数で独自のマクロ/関数を定義できます。

誰も最もクリーンなソリューションに言及していないのはなぜですか?

bool AMustBeEqualToB = (a == b);
assert(AMustBeEqualToB);