va_list型について
あるC言語のソースを見ていたら、va_list型の引數を持つ函數がありました。
そのソースは複雜なので、質問するために以下のソースを作りました。
(ですから、このプログラムはじつよう性もないし、無意味なこともしています。)
#include <stdio.h>
#include <stdarg.h>
int sum_func1(int sw1, va_list ap1)
{
int sum1 = 0;
va_start(ap1, sw1);
sum1 += va_arg(ap1,int);
sum1 += va_arg(ap1,int);
va_end(ap1);
return(sum1);
}
int sum_func0(int sw0, ...)
{
int sum0;
va_list ap0;
int a0, b0;
va_start(ap0, sw0);
a0=va_arg(ap0, int);
b0=va_arg(ap0, int);
printf("sum_func0です。これから%dと%dを足します。\n", a0, b0);
sum0 = sum_func1(sw0, ap0);
va_end(ap0);
return(sum0);
}
int main(void)
{
printf("1 + 2 = %d\n", sum_func0(0,1,2));
return 0;
}
やっていることは、結局のところ、1と2を足してその結果を表示しているだけです。
このプログラムは動かすことはできますが、表示される足し算の結果がおかしいです。
sum_func0の中で 1(a0)と2(b0)は既にva_argを使って取得しています。
その後、sum_func1の中で、再び この1と2を取得しようとしているのですが、
このようなことは可能でしょうか。
可能ならば、どのように修整すればよいのでしょうか。
これが可能か否かが元のソースの讀み方に影響するのです。
最初に述べたように、va_list型の引數を持つ函數についての質問なので、
va_list型の引數を使わないような修整方法ですと、
期待するものではありません。