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)
{
( "Test Message" );
DEBUG_PUTS}
実行結果:
Test Message
DEBUG_MODE が定義されていなければ、空のマクロになるように #ifdef を使って切り分けています。
問題② assert の次のような使い方には問題があります。理由を説明して、正しく修正してください。
int n = -2;
( ++n >= 0 ); assert
assert に与える式は評価されるため、副作用があると、assert が有効なときと無効なときとで、プログラムの実行結果が変わってしまう恐れがあります。
インクリメント演算子は、変数の値を変更してしまうので問題があります。assert が有効なら、変数 n の値は +1 されますが、assert が無効であると、変数 n の値は変化しないまま、後続の処理が続くことになります。
インクリメントは、assert の前で行うように修正します。
int n = -2;
++n;
( n >= 0 ); assert
return 0;
を削除(C言語編全体でのコードの統一)’2018/6/4 新規作成。
Programming Place Plus のトップページへ