C支持参数可变的函数

 

: 当调用函数add_values(10,20,30,0)时,调用的堆栈为:

-------------

10

-------------

20

-------------

30

-------------

0

-------------

函数返回地址

-------------

 

可以通过宏va_listva_start va_arg va_end 来从堆栈中读出数据。

原理比较简单、就是指针++

函数

int add(int value,...)

{

va_list ptr;

int result=0;

result +=value;

va_start(ptr,value);

while((value = va_arg(ptr,int))!=0)

{

     result += value;

}

va_end(ptr);

return result;

}

void main (void)

{

printf("%d",add(1,2,3,0));

}

最后的0,是用来指示已经到达末尾,不要再读了;(此函数设计不好,假如我用add(1,2,0,3,0)就只加前面两个,这里只是一个例子)

printf() 也是采用更好的方式,它前面有 "字符串" 指示要读取多少个,所以不用一个特别的结束符号。

 

注:由于实现比较原始,所以容易出错,例如,在0之后指针再++,就会跑到返回地址。

你可能感兴趣的:(c,list)