「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))))