重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
很巧我现在正好也有实现这样函数的需求,其实就是看了C语言可变参数函数的相关资料,你就差不多知道怎么实现了。
成都创新互联是一家专业提供东兴企业网站建设,专注与成都网站设计、做网站、H5技术、小程序制作等业务。10年已为东兴众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。
只不过其中有一个很重要的大坑,只要迈过去就没问题。我是试了半天才明白的:
如果参数是char或float类型,这样的参数放在可变参数部分的话,编译器是会默认把它们的类型提升为相应的“全”类型的:char提升为int,float提升为double。如果你没注意这一点就会出现错误。当然可以通过指针的类型转换来避免。
先简略地点一下,等我在CSDN博客里详细地写一写心得吧。虽然是N年前的问题估计楼主早就自己解决了,但希望能帮到其他人:)
在函数定义的时候就必须写形参名了。声明的时候不需要,因为编译器还用不到,只要知道相应位置是个啥类型的就行了
C语言中定义了va_list, va_start( ), va_arg( ), va_end( ) 这样一组宏来处理可变参数问题。
可以参考printf的声明,创建自己的实现函数。示例:
#includestdio.h
#includestdarg.h
void va_fun(int start,...)
{
va_list arg_ptr;
int nArgValue = start;
int nArgCount = 1;
va_start(arg_ptr,start);
while(nArgValue != -1)
{
printf("arg %d is:%d/n",nArgCount,nArgValue);
nArgValue=va_arg(arg_ptr,int);
++nArgCount;
}
return;
}
main()
{
va_fun(5,1,7,-1);
printf("................/n");
va_fun(2,4,-1);
printf("................/n");
va_fun(-1);
printf("................/n");
//va_fun(); 可变参数函数最少要有一个参数。
}
这样的输出结果是不确定的!
-------
分析:你在args函数中对不定参进行遍历,但要求最后是0时跳出循环,
显然main中的数据不符合要求,导致遍历溢出,结果难以预测。
-------
修正:
void main(){
args(1,2,0);
}
输出:
2