回答:
私が見たハックは、&&
演算子を使用することです。ポインターがnullでない場合、ポインターは「真」であるため、条件を変更せずに以下を実行できます。
assert(a == b && "A is not equal to B");
assert
は失敗した状態を示しているため、メッセージも表示されます。それだけでは不十分な場合は、必要なmyAssert
ものを表示する独自の関数またはマクロを作成できます。
assert(("A must be equal to B", a == b));
assert(a == b && "A (" << A << ") is not equal to B (" << B << ")");
printf
何かを出力した場合にゼロ以外の値を返すため、などの操作を実行できますassert(a == b && printf("a (%i) is not equal to b (%i)", a, b))
が、その時点でおそらく独自のアサートラッパーを作成する必要があります。
もう1つのオプションは、オペランドを逆にしてコンマ演算子を使用することです。コンマが引数間の区切り文字として扱われないように、追加の括弧が必要です。
assert(("A must be equal to B", a == b));
(これは、見やすくするために、上記のコメントからコピーされました)
#define m_assert(expr, msg) assert(( (void)(msg), (expr) ))
メッセージを受け取り、すべてを明確に出力する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行目
素晴らしく、きれいです。コードで自由に使用してください=)
x == y
。次に、Exprが展開されif( !(x == y))
、ここで条件がチェック"x == y"
されます。#Exprが文字列リテラルに展開され、エラーメッセージに表示されます。
BOOST_ASSERT_MSG(expre, msg)
http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html
これを直接使用するか、Boostのコードをコピーします。また、Boostアサートはヘッダーのみであるため、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__
カスタムメッセージを受け取り、独自の機能で、等