* acl4_001: ADbgLv(デバッグレベル) -(by [[K]], 2025.11.28) ** (1) -acl4での重要な概念としてデバッグレベルというのがあります。 -プログラム内にデバッグ支援のためのコードをいろいろ入れるわけですが、それらは当然速度低下やメモリ消費量の増大を伴います。デバッグが済んだら、これらのデバッグ支援コードはすべて消えてほしいです。 -というか、リリース時にはすべて消えるとわかっているからこそ、デバッグ支援コードを積極的に入れられます。そうでなければ「こんなチェックは当たり前に通るだろうだから省略しようかな。実行速度が落ちたら嫌だし」みたいな誘惑にかられるわけです。これはよくありません。 -ADbgLVというマクロに0~5の値を定義して使います。コード内に以下の記述があるので、未定義なら自動で ADbgLv=2 になります。 #if (!defined(ADbgLv)) #define ADbgLv 2 #endif --ADbgLv=0: リリースモード。デバッグチェックはすべて消される。 --ADbgLv=1: 準リリースモード。デバッグチェックはすべて消されるが、デバッグ用のメモリ確保はデバッグ時と同じように行われる(sizeof値がデバッグ時と同じになる)。この追加で確保されたメモリ領域への初期化や書き込みは行わない。 --ADbgLv=2: 軽量デバッグモード。簡単なデバッグチェックは行われる。負荷はそれほど増えない。 --ADbgLv=3: 中規模デバッグモード。負荷は少し増える。 --ADbgLv=4: 大規模デバッグモード。負荷がかなり大きいデバッグチェックでもちゃんと行う。 --ADbgLv=5: まだ一度も使ったことはない。 -デバッグチェックの例: --AdbgLv>=3だと、mallocしたメモリはすべてゴミデータを書き込まれた状態で渡します。これで初期化忘れバグを発見しやすくします。freeするときも、ゴミデータで埋めてからシステムに返します。これでfree後に誤って参照しているケースに気づきやすくなります。ADbgLv=2ではそこまではやりません。 ** (2) -この関数は、ADgbLv>=2では呼んでほしいけど、ADbgLv<=1では呼ばないでほしい(呼び出しコードごと消えてほしい)と思うことはよくあります。そういうときに、 #if (ADbgLv >= 2) debugFunc(a, b, c); #endif -と書くのはおっくうです。それでこんな表記ができます。 ADL2(debugFunc(a, b, c)); ADbgLv2(debugFunc(a, b, c)); -これだけで上記と同じ挙動になります。 -ADL2()の中に変数宣言を書くこともできます。 ADL2(int i); -ただし、ADL2()の中にコンマを書くと引数が2個あるとみなされて2番目以降の記述が捨てられるので、その時は_ADL2()を使います(あきらめて素直に #if 使うほうがいいかもしれないですが)。 ADL2(int i)_ADL2(j); // int i,j; になる. -ADbgLv2()の中に変数宣言を書くこともできます。 ADbgLv2(int i); -ただし、ADgbLv2()の中にコンマを書くと引数が2個あるとみなされて2番目以降の記述が捨てられるので、その時は_ADbgLv2()を使います(あきらめて素直に #if 使うほうがいいかもしれないですが)。 ADbgLv2(int i)_ADbgLv2(j); // int i,j; になる.