assert
読み:アサート
外語:assert

 C/C++/Javaなどで、アサーションを行なうための使用するもの。Javaでは予約語だが、C/C++ではマクロである。
目次

特徴

Java
 Javaでは予約語の一つである。
 Javaのもともとの仕様(OAK)には存在していたものが、満足な設計と実装を行なう時間的余裕がなかったため、初期の公開仕様では削除されていた。
 Java2 1.4で復活。

C/C++

マクロ
 C/C++ではマクロで、与えらえた式がだった場合にはプログラムの実行が終了する。
 NDEBUG(No Debugの意)というプリプロセッサーシンボルが定義されている場合は、マクロ全体が「(void)0」のような最適化後に消滅する式に置換されるため、パフォーマンスの低下を避けることが可能。

書式
 マクロなので、使用するにはincludeが必要。
 #include <assert.h>
 assert(条件式)

定義
 FreeBSDでは、assert.hで次のように実装されている。
 #ifdef NDEBUG
 #define assert(e) ((void)0)
 #define _assert(e) ((void)0)
 #else
 #define _assert(e) assert(e)
 #define assert(e) ((e) ? (void)0 : __assert(__func__, __FILE__, __LINE__, #e))
 #endif
 NDEBUGがある場合は常時、そうでなくてもassertの条件式eが真なら、マクロは(void)0になり、コンパイルの段階で最適化により消滅する。
 逆に、NDEBUGが無く、assertの条件式eが偽なら、エラー表示後プログラムを強制終了(abort();)する関数__assertを呼び出すことになる。この関数は標準Cライブラリ内にあり、ソースは/usr/src/lib/libc/gen/assert.cに存在する。

再検索