C/C++ の assert は expect と読み替えると混乱しづらい ― 2021年03月03日 13時09分54秒
assert 関数(マクロ)の引数を式に渡す。その式が評価され、偽の場合はエラーを出力し、プログラムを終了させる。元々はデバッグ用に作られた関数。そのため、#define NDEBUG を定義すると、強制終了を無効化できる。開発時に引数の検査等に使い、本番環境では NODEBUG を使って、余分なコードを落すのに使える。
簡単な例。
さて、歳は負の数にはならないので引数を点検する。
#include <assert.h>
#include <stdbool.h>
bool check_age( int age )
{
assert( age >= 0 );
return true;
}
int main()
{
check_age( 3 );
check_age( -1 );
return 0;
}
% cc assert.c
% ./a.out
Assertion failed: (age >= 0), function check_age, file assert.c, line 6.
Abort
この assert は個人的に強制終了の意味が強くて、勘違いする。上の assert( 歳がゼロか整数 ) を「強制終了( 歳がゼロか整数 )」と読んでしまう。assert が偽の時に起きるのが混乱の元になっている。そこで、最近は assert を見ると expect に置き換えて読むようにしている。そうすると「期待値( 歳がゼロか整数 )」の用になって、負の否定が無くなって読みやすくなる。
これを習慣にしたら、assert を逆に入れてしまう初動ミスを減らせた。
bool check_age( int age )
{
expect( age >= 0 );
return true;
}
コメント
トラックバック
このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2021/03/03/9352620/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。