关于 #include "stdarg.h" 相关知识小结:
函数:tppedef va_list char * ;
va_list al;
va_start(al, fmt) 使 al 指向变参函数中最后一个已知参数(从右往左数的第一个已知参数)
va_arg(两个参数) ,第一个参数是:被声明为 va_list 类型的变量,第二个参数则是类型名,要想获得每一个变参,最重要的是知道它的类型,在程序翻译时,这个宏被扩展为一个表达式,所以它可以直接作为运算符 += 的右操作数
开始,令va_list类型的变量ap指向最后一个已知参数,此后,每调用一次va_arg,都会使ap指向下一个参数(变参)并取得(计算出)他的值。
va_end(); 使用va_start();后一定要使用va_end();才能保证返回时一切正常
书P190上下,例程以及例题结合理解。
计算传入参数的加和,普通的写法 :
使用 #include " stdarg.h "
计算传入参数的加和
所调用的函数在主函数之前,利用函数定义的方式声明
c
#include "stdio.h"
#include "stdarg.h"
int sum_ints(unsigned int count,...)
{
int sum = 0;
va_list ap;
va_start(ap,count);
while(count--)
sum += va_arg(ap,int); //第一个参数是变量,第二个参数是变量的类型
va_end(ap);
return sum; //return 最终返回值变量类型和函数类型必须是统一的
}
int main()
{
int x,y;
x = sum_ints(2,100,200);
y = sum_ints(0);
printf("%d, %d\n",x,y);
return 0;
}
函数定义在主函数之后,并且利用普通函数类型定义的方式声明子函数
感觉在这个程序里面这样去定义就是多此一举,但是如果在一个这种类型很多的函数里面,就会非常方便
c
#include "stdio.h"
#include "stdarg.h"
typedef int F(unsigned int count,...);
int main()
{
F sum_ints;
int x,y;
x = sum_ints(2,100,200);
y = sum_ints(0);
printf("%d, %d\n",x,y);
return 0;
}
int sum_ints(unsigned int count,...)
{
int sum = 0;
va_list ap;
va_start(ap,count);
while(count--)
sum += va_arg(ap,int); //第一个参数是变量,第二个参数是变量的类型
va_end(ap);
return sum;
}