[C言語][Apache] 可変長引数マクロ(ap_log_error引数多すぎ)
Apacheモジュールからログを吐く場合、ap_log_error関数を使用します。
errorという名前ですが、第2引数を切り替えてdebug, infoなど開発中のログを吐く場合も使われます。
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, r->server, "url=%s", url);
ある程度の経験のあるプログラマならば、毎回こんなにたくさんの引数を書くのは面倒だということに気づくと思います。
私もすぐに嫌になりました。
というわけでいつもの可変長引数のテクニックを使って
static void trace(request_rec* r, const char* fmt, ...) { va_list argp; char buff[4096]; va_start(argp, fmt); vsprintf(buff, fmt, argp); va_end(argp); ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, r->server, buff); }
こんな感じのお気楽関数を作ってみました。4KB以上の文字列はどうするんだよとかはまぁお気になさらず。(vnsprintfを使うのが筋でしょう。)
これはこれで便利なのですが、第一引数は相変わらず書かなきゃいけないし、いまいちスマートではないです。
そんな時ふと可変長引数マクロサポート@C99を思い出しました。
そしてずばり解決。
#define TRACE(...) ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, r->server, __VA_ARGS__)
こうすれば
TRACE("start hogehoge"); TRACE("url=%s" , url);
などと書けて幸せです。
以前も同じような記事を書いたかもしれないが気のせいだろうか。
Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)
- 作者: 小山浩之
- 出版社/メーカー: 技術評論社
- 発売日: 2003/08/01
- メディア: 単行本
- 購入: 1人 クリック: 81回
- この商品を含むブログ (26件) を見る