va_start()、va_arg() マクロの背後にあるものを把握しようとしています。以下のコードはうまく機能します。
#include <iostream>
#include <cstdarg>
void f(double a, double b, ...)
{
va_list arg;
va_start(arg, b);
double d;
while((d = va_arg(arg, double)) != 0)
{
std::cout << d << '\n';
}
}
int main(int argc, char *argv[])
{
f(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 0.0);
return 0;
}
予想どおり、次のような出力が得られました: 3 4 5 6 7 8 9. 次に、そのマクロの定義を見つけました (インターネットでは、ヘッダー stdarg.h が不思議なため、マクロ va_arg(v, l) を _builtin_va_arg( のように定義します) v、l)、最後は定義されておらず、stdarg.hには何も含まれていないため、ライブラリにあるのですか???)。それにもかかわらず、「cstdarg」の代わりに私は書きました:
typedef char* va_list;
#define _INTSIZEOF(n) \
((sizeof(n)+sizeof(int)-1) &~(sizeof(int)-1))
#define va_start(ap,v) \
(ap = (va_list)&v + _INTSIZEOF(v))
#define va_arg(ap,t) \
(*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
#define va_end(ap) (ap = (va_list)0)
出力は 1 -0.0409377 -0.0409377 4.88084e-270 4.85706e-270 1 2 3 4 5 6 7 8 9 のように奇妙になりました。可変引数は最後に宣言されたパラメータのすぐ隣に配置されていると思いましたが、どうやらもっと複雑なパラメータがあるようです状況。どこが間違っているのか、実際に何が起こっているのかを誰かが明らかにしてくれたら、とてもうれしいです。