Assertによってスローされたメッセージを追加または編集する方法はありますか?次のようなものを使用したい
assert(a == b, "A must be equal to B");
次に、コンパイラはline、timeなどを追加します...
出来ますか?
私が周りで見たハックは、&&
演算子。ポインターがヌルでない場合、ポインターは「true」であるため、条件を変更せずに以下を実行できます。
assert(a == b && "A is not equal to B");
assert
は失敗した状態を示しているため、メッセージも表示されます。十分でない場合は、必要なものを表示する独自のmyAssert
関数またはマクロを作成できます。
別のオプションは、オペランドを逆にしてコンマ演算子を使用することです。コンマが引数間の区切り文字として扱われないように、追加の括弧が必要です。
assert(("A must be equal to B", a == b));
(これは、見やすくするために上記のコメントからコピーされました)
メッセージを受け取り、すべてを明確な方法で出力する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行目
きれいで、コードで自由に使用してください=)
BOOST_ASSERT_MSG(expre, msg)
http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html
それを直接使用するか、Boostのコードをコピーすることができます。また、Boost assertはヘッダーのみであるため、Boostのすべてをインストールしたくない場合は、その単一のファイルを取得することもできます。
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");
コードの人間の解析の観点から読みやすさ。言語ハックでもありません。
assertはマクロ/関数の組み合わせです。 __FILE__
、__BASE_FILE__
、__LINE__
などを使用して、カスタムメッセージを受け取る独自の関数で独自のマクロ/関数を定義できます。
誰も最もクリーンなソリューションに言及していないのはなぜですか?
bool AMustBeEqualToB = (a == b);
assert(AMustBeEqualToB);