assert
プロセスを中止しますが、プログラムが -DNDEBUG
でコンパイルされると何もしません であるため、これはかなり大雑把なデバッグ ツールであり、それ以上のものではありません。 assert
のみを使用してください 「あり得ない」状況をチェックします。アルゴリズムの不変条件または事後条件に違反しますが、おそらく そうではない 入力検証用(確かにライブラリにはありません)。クライアントからの無効な入力を検出した場合は、友好的にエラー コードを返します。
assert
の使用例 たとえば、非常にスマートなソート アルゴリズムを実装しており、それが本当にソートされるかどうかを確認したい場合です。並べ替え関数は「正常に機能する」はずで、値を返さないため、API を変更せずにエラー リターンを追加することはできません。
void sort(int *a, size_t n)
{
recursive_super_duper_sort(a, 0, n);
assert(is_sorted(a, n));
}
static bool is_sorted(int const *a, size_t n)
{
for (size_t i=0; i<n-1; i++)
if (a[i] > a[i+1])
return false;
return true;
}
長い目で見れば、assert
の代わりに、この種のことに対して適切な単体テスト フレームワークが本当に必要になるでしょう。 ですが、一時的なデバッグ ツールとしては便利です。
エラー コードは実行時の動作を知らせます。アサーションは、開発者が仮定をアサートできるようにするデバッグ ツールです。 プログラム ロジックについては確かに真実です。
これらは、用途が異なる 2 つの完全に異なるものです。
エラー コードは、通常のプログラム フローの一部です。アサーションはのみ アサーションがトリガーされた場合は、プログラムが正しく記述されていないことを意味します。
一般に、アサーションは、プログラマー (つまり、あなた) が実際のユーザーにプログラムをリリースする前にロジック/プログラミング エラーを見つけるためのものです。実行時入力エラーの検出にはアサートを使用しないでください。これらにはエラー コードを使用してください。