C/C++ の assert は expect と読み替えると混乱しづらい2021年03月03日 13時09分54秒

assert には本来、「断言する、力説する、強く主張する」等の意味がある。C 言語や C++ ではマクロ関数として定義されていて assert.h から使える。

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 に置き換えて読むようにしている。そうすると「期待値( 歳がゼロか整数 )」の用になって、負の否定が無くなって読みやすくなる。

bool check_age( int age )
{   
    expect( age >= 0 );
    return true;
}
これを習慣にしたら、assert を逆に入れてしまう初動ミスを減らせた。