このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

さよなら varargs.h

「Cで、関数の引数を後始末するのは呼び側だったよね」で話題にしたようなスタックフレームの構造、特に引数の位置は、以前なら varargs.hのマクロ定義を参考にしていました。ところが、varargs.hは廃止の方向です。

とはいえ、stdarg.h は残っているのだから、stdarg.hを見れば引数の取り方を確認できるだろうと思ってのぞいたみたら:


#define va_start(v,l) __builtin_va_start(v,l)
#define va_end(v) __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)

ガーン、こんなことになっているんだ。コンパイラがやってくれるんだ。もはや、あのトリッキーなマクロはお払い箱なのね。

さよなら、varargs.h。さよなら、変態マクロ。

[追記]
古式マクロを記念に(?)貼り付けておこう。


#define __va_rounded_size(TYPE) \
(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))

#define va_start(AP, LASTARG) \
(AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))

#define va_end(AP)

#define va_arg(AP, TYPE) \
(AP += __va_rounded_size (TYPE), \
*((TYPE *) (AP - __va_rounded_size (TYPE))))

[/追記]