...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

assert (2)

前回の記事で Assertion の必要性が理解してもらえたでしょうか.


この記事では, VC++ の Debug/Release の違いを assert を使う面から説明したいと思います.


前回のソースコードの先頭付近で assert.h をインクルードしています.
これをすることで assert が使えるようになるわけです.
このヘッダーファイルの assert が宣言されている部分を見てみましょう.
すると,あるマクロが定義されいるときは assert は何もしない命令に置き換えられていることがわかります.
そのマクロは NDEBUG です.
ここに Debug モードと Release モードのからくりが秘められているんですね.
さあ,どういうことか見ていきましょう.


前回のソースコードは開発途中のもので,デバッグをするためのコード assert が含まれていました.
ところが,開発が完了したとき,つまり,リリース時には, assert が実行効率を低下させてしまうため取り除くべきです.
このとき,いちいちすべての assert をコメントアウトするのではやってられません!
それではどうするかというと,先ほど説明した NDEBUG マクロを使います.


前回のソースコードの一番最初に


#define NDEBUG

と書き加えてください.
そして, main 関数の中にあるコメントアウトされた行を有効にして,もう一度コンパイルして実行してみるとどうなるでしょうか.
今度はエラーによる強制終了がされなかったと思います.
assert.h をインクルードするよりも前に NDEBUG マクロが定義されていたから assert は何もしない命令に置き換えられたということですね.


VC++MFC を使っていて Debug ビルドのときは _DEBUG マクロが定義されます.
従って,このマクロが定義されているかどうかで Debug/Release それぞれで処理を振り分けることができます.
この方法を使って実装されたマクロの中に大文字で書いた ASSERT があります.
ANSI C/C++ の assert とは違って, Microsoft が独自に定義したものです.
ちょっと調べてみたら MFC を使っているときには ASSERT を使うほうがいいようでした.
詳しくは出てきませんでした(ごめんなさい・・・).
こちらも同じように Release ビルドのときには何もしない命令に置き換えられます.


さて, assert を使う際に唯一気をつけることがありますので,次はその説明をしましょうね.
ではでは.