いや,デバッガ使えよ ←
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入るから動くのかな?