デバッグ関連のマクロと関数

エラーチェックを行ったり,防衛的プログラミング (defensive programming) を行う場合に便利なマクロです.wxWidgets には,assert ライクのマクロが 三種類定義されています: このうち, wxASSERT および wxFAIL マクロは __WXDEBUG__ が定義されている場合 (言い換えればデバッグビルドである 場合) には所定の動作を行いますが,リリースビルドではコード自体が全く 除去されてしまいます.一方, wxCHECK マクロはリリースビルドでも存在 しつづけますが,チェックに失敗してもユーザから目に見えるような動作を 行いません.コンパイル時のアサーションはランタイム時には発生せず, コンパイル時にチェックに失敗するとエラーメッセージを出力するように なっています.

Include files

<wx/debug.h>



::wxOnAssert



void wxOnAssert(const char * fileName, int lineNumber, const char * cond, const char * msg = NULL)

この関数はデバッグ用マクロの失敗 (すなわちアサーションの評価値が false になる場合) に必ず呼び出されます.この関数はデバッグモード中だけで 定義されており,リリースビルドでは wxCHECK に失敗 しても何も起こりません.

デバッグビルドのデフォルトの動作では,ユーザにダイアログを表示して, プログラムを中断するか,単に実行を継続するか,それ以降のすべての アサーション失敗を無視しながら実行を継続するかを聞くようになっています. この動作をオーバライドするには,グローバルのアプリケーションオブジェクトが 終了する際にこの関数から呼び出される wxApp::OnAssert をオーバライドします.



wxASSERT



wxASSERT( condition)

アサーション用のマクロです.デバッグモード中でアサーションに失敗すると エラーメッセージを出力します.リリースビルドでは何も行いません.

wxASSERT() 内の条件式 condition はリリースモードでは全く実行されないので, 副作用を持つような条件式を設定してはなりません.

See also

wxASSERT_MSG,
wxCOMPILE_TIME_ASSERT



wxASSERT_MIN_BITSIZE



wxASSERT_MIN_BITSIZE( type, size)

このマクロを使うと,type の大きさが size ビットよりも小さい場合, コンパイル時アサーション失敗 (compile time assertion failure) を引き起こします.

例えば以下のように利用します:

    // int が 2^32 までの値を記憶できることに依存している場合
    wxASSERT_MIN_BITSIZE(int, 32);

    // wchar_t に UTF-8 を使っているようなプラットフォームでは
    // 動作しない場合
    wxASSERT_MIN_BITSIZE(wchar_t, 16);



wxASSERT_MSG



wxASSERT_MSG( condition, msg)

メッセージつきのアサーションマクロです.条件式 condition が false の場合,エラーメッセージを生成します.

See also

wxASSERT,
wxCOMPILE_TIME_ASSERT



wxCOMPILE_TIME_ASSERT



wxCOMPILE_TIME_ASSERT( condition, msg)

wxCOMPILE_TIME_ASSERT を使うと,condition に指定した 条件式が false になった場合にコンパイルエラーを引き起こします. コンパイラのエラーメッセージには, msg 識別子が入ります - 他のマクロと違い,msg は文字列ではなく有効な C++ の識別子で なければならないので注意してください.

このマクロは,主に sizeof 演算子を含むような式をテストする際に 便利です.プリプロセッサはsizeof 演算子をテストしませんが, コンパイル時のテストが必要な場合もあるからです.

このマクロは内部的に構造体を定義しています.構造体の定義が唯一のものに なるように名前には__LINE__ を使っていますが,二つの異なる ソースファイル中で同じ行を使った場合には動作しません.この場合, どちらかの行だけを残すか, wxCOMPILE_TIME_ASSERT2 マクロを 使ってください.

また,Microsoft Visual C++ には,このマクロを `Program Database For Edit And Continue' オプション (/ZI) を使って コンパイルするとコンパイルエラーを引き起こすというバグがあるので, このマクロを使っているコードには /ZI オプションを使わないように してください (/Zi は問題ありません)

See also

wxASSERT_MSG,
wxASSERT_MIN_BITSIZE



wxCOMPILE_TIME_ASSERT2



wxCOMPILE_TIME_ASSERT( condition, msg, name)

このマクロで内部的に定義されている構造体の名前を name に指定して, 上で 述べたようなコンパイルエラーに遭遇 しないようになっている他は wxCOMPILE_TIME_ASSERT2 と同じです.



wxFAIL



wxFAIL(void)

(デバッグモード中で) このコードに到達すると,常にアサーションエラーを 生成します.

See also

wxFAIL_MSG



wxFAIL_MSG



wxFAIL_MSG( msg)

(デバッグモード中で) このコードに到達すると,常に指定したメッセージを 伴うアサーションエラーを生成します.

このマクロは「到達不可能な (unreachable)」 なコード領域をマークする 際に便利です.例えば,switch 文で,起こりうるすべてのケースが default 文以外の case 文で処理されているような場合の default ブランチに利用 できます.

See also

wxFAIL



wxCHECK



wxCHECK( condition, retValue)

condition が真であるか調べ,そうでなければ (デバッグモードで FAIL になれば) 指定した戻り値を返します. チェック自体はリリースモードでも行われます.



wxCHECK_MSG



wxCHECK_MSG( condition, retValue, msg)

condition が真であるか調べ,そうでなければ (デバッグモードで FAIL になれば) 指定した戻り値を返します. チェック自体はリリースモードでも行われます.

このマクロは void 型でない関数でしか利用できません. wxCHECK_RET も参照してください.



wxCHECK_RET



wxCHECK_RET( condition, msg)

condition が真であるか調べ,そうでなければ (デバッグモードで FAIL になれば) 指定した戻り値を返します. チェック自体はリリースモードでも行われます.

このマクロは void 型の関数で wxCHECK_MSG の代わりに利用できます.



wxCHECK2



wxCHECK2( condition, operation)

condition が真であればwxFAIL を実行し, そうでなければ operation を実行します.wxCHECK を一般化したもので,condition が false の際に,単に関数から 処理を戻す以外のことを実行したい場合に利用します.

チェック自体はリリースモードでも行われます.



wxCHECK2_MSG



wxCHECK2( condition, operation, msg)

wxCHECK2 と同じですが, This is the same as wxCHECK2, but wxFAIL_MSG with the specified msg is called instead of wxFAIL() if the condition is false.



::wxTrap



void wxTrap(void)

この関数は,デバッグモード (__WXDEBUG__ が定義されている場合) で,デバッグ用例外 (debugging exception) を生成し,プロセスにデバッガ がアタッチされている際に処理をデバッグに渡すようにできます.それ以外の 場合,プログラムは異常終了します.

リリースモードでは何も行いません.

Include files

<wx/debug.h>



::wxIsDebuggerRunning



bool wxIsDebuggerRunning(void)

プログラムがデバッガの下で動作している場合に true を返し, それ以外の場合には false を返します.

この関数は現在のところ, CodeWarrior を使ってビルドした Mac だけで 実装されており,それ以外の場合には常に false を返すので注意して ください.

ymasuda 平成17年11月19日