LoginSignup
13

More than 5 years have passed since last update.

printfデバッグのためのdebug.h

Last updated at Posted at 2012-12-26

いや,デバッガ使えよ ←
Kobitoからの投稿テストも兼ねて.

仕様

1. メッセージは標準エラー出力に出す

なんとなく標準出力じゃねーだろと思った.
fprintf( stderr, ... )で実装する.

-

2. コンパイル時に-D NDEBUGで何もしないようにする

リリース時を考えて,何もしないようにする機能が欲しかった.
-D NDEBUGにしたのは,assert()と一緒に使えばいいと思ったから.

-

3. printfらしく使いたい

つまり,フォーマット指定子を使いたい.
となれば,必然的に可変長引数を扱える必要がある.

-

4. 表示メッセージに行番号とか入れたい

デバッグに使うものですからね.
最低限【ファイル名】と【行番号】は欲しい.
この場合,マクロで定義する必要がある.
[日付] ファイル名:行番号 # メッセージとかイイネ!

-

5. C99規格準拠

仕様3および4より.
C99規格ならマクロでも可変長引数が扱える.

-

実装

というか定義?宣言?
とにかく作ってみた

debug.h
#ifndef _DEBUG_H_
#define _DEBUG_H_

#ifdef NDEBUG
    // NDEBUGが定義されているときは何もしない
    #define debug( fmt, ... ) ((void)0)
#else /* !NDEBUG */
    // NDEBUGが定義されていないときはprintfデバッグ用関数化
    #include <stdio.h>
    #define debug( fmt, ... ) \
        fprintf( stderr, \
                  "[%s] %s:%u # " fmt "\n", \
                  __DATE__, __FILE__, \
                  __LINE__, ##__VA_ARGS__ \
        )
#endif /* NDEBUG */
#endif /* _DEBUG_H_ */

##__VA_ARGS__について

__VA_ARGS__を使う場合,debug( fmt, ... )の第2引数以降に何らかの引数を入れないと,__LINE__の後ろのコンマが邪魔になってコンパイルエラーが起こる.

  • つまり,debug("ここまできたよ〜")みたいな使い方ができない問題に直面した.
  • いろいろと調べた結果,##__VA_ARGS__ならエラーが起こらないらしいとの情報を得る.
  • 試してみると確かにdebug("ここまできたよ〜")でもコンパイルエラーにならない.
  • この辺はまだまだ勉強不足ですね.

使用方法など

  • printfと同じように使えます.
  • assertなんかと一緒に使うと,開発効率が上がった気になります.
  • メッセージの表示形式は,Rubyで使用されているLoggerの影響を若干受けている感じが…
  • Linux (Ubuntu 11.10~) および Mac (Xcode 4.1~) で動作確認済み.
  • Windowsでは未検証.Cygwinならgcc4.3入るから動くのかな?

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13