先頭へ戻る

アサート 解答ページ | Programming Place Plus C言語編 第30章

Programming Place Plus トップページC言語編第30章

先頭へ戻る

問題①

問題① 標準エラーに、末尾での改行付きで文字列を出力するマクロを、デバッグ作業中にだけ有効になるように作成してください。


標準エラーへの出力には fputs関数や fprintf関数を使えばよいですが、改行が必要であることを考えると、fprintf関数を使った方が書きやすいでしょう(fputs関数でやってみようとすると分かります)。

デバッグ作業中かどうかは、NDEBUG で判定する手もありますが、ここでは DEBUG_MODE という独自のマクロを定義するものとします。

#include <stdio.h>

#define DEBUG_MODE

#ifdef DEBUG_MODE
#define DEBUG_PUTS(str)   fprintf(stderr, "%s\n", str)
#else
#define DEBUG_PUTS(str)
#endif

int main(void)
{
    DEBUG_PUTS( "Test Message" );
}

実行結果:

Test Message

DEBUG_MODE が定義されていなければ、空のマクロになるように #ifdef を使って切り分けています。

問題②

問題② assert の次のような使い方には問題があります。理由を説明して、正しく修正してください。

int n = -2;
assert( ++n >= 0 );


assert に与える式は評価されるため、副作用があると、assert が有効なときと無効なときとで、プログラムの実行結果が変わってしまう恐れがあります。

インクリメント演算子は、変数の値を変更してしまうので問題があります。assert が有効なら、変数 n の値は +1 されますが、assert が無効であると、変数 n の値は変化しないまま、後続の処理が続くことになります。

インクリメントは、assert の前で行うように修正します。

int n = -2;
++n;
assert( n >= 0 );


参考リンク


更新履歴

’2018/6/4 新規作成。



第30章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ