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入るから動くのかな?
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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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