以下のメッセージを削除します。


[2222] ポインタ完全制覇(第2版) Fig2-10とデバッグライト
返信


投稿者:Hiroyuki Naito
2020/01/26 08:29:45

Link:
お世話になります。

細かいことで恐縮ですが、Fig2-10で「"&d, %s\n"へのポインタ」とありますが、「"%d, %s\n"へのポインタ」の誤植と思われます。

私が使っているCコンパイラはgcc 5.4.1 c99でしたので、p128で紹介されている__VA_ARGS__を以下のように使ってみました。

void debug_write(char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vfprintf(stderr, fmt, ap);
    va_end(ap);
}

#define DEBUG_WRITE(...) debug_write(__VA_ARGS__)
でもちろん動作OKでしたが、

#define DEBUG_WRITE(...) fprintf(stderr, __VA_ARGS__)
でもokでした。
「debug_write()関数の呼び出しのオーバーヘッドは避けられない(p127)」ということでしたが、fprintf()関数でも同様でしょうか。
〈使用例〉
int i = 300;
char *p = "hoge";
DEBUG_WRITE("%s %d\n", p, i);

また、
#define SNAP_INT(arg) fprintf(stderr, #arg "...%d", arg)
の中の#argは引数名そのものを指しているようですが、(他のC言語の解説書では)見たことのない使い方でした。できましたら、補足説明をお願いいたします。

パスワード:

管理者削除