Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

いや,デバッガ使えよ ←
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入るから動くのかな?
tamy0612
JinTech
システム開発のサードプレイス(会社でも個人でもない第三の場所)を求めるエンジニアが集まるチーム。サービス開発、スキルアップ勉強会を実施。
http://web.jintech.team/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away