c语言 怎么写 可变 参数函数 c语言如何封装一个带有可变参数的方法?
#include <stdarg.h> //可变参数函数必要的头文件
#include <stdio.h>
long int sum(unsigned int argc,...) //可变参数函数必须包含至少一个确定的参数
{
long int srt=0;
int va;
unsigned int i;
va_list vl; //用于指向可变参数列表
va_start(vl,argc); //初始化,va_start()调用的第一个参数是所编写的可变参数函数的最后一个确定的参数
for (i = 0; i<argc; i++) {
srt+=(int)va_arg(vl,int); //从参数列表按提取一个int类型的值参与相加运算
}
va_end(vl); //清理
return srt;
}
int main(int argc, char* argv[])
{
printf("%ld
",sum(3,1,2,3));
return 0;
}
许多程序设计语言中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,这就是程序中的函数。如C语言中:
int max(int x,int y)
{
return(x>yx:y;);
}
就是一段比较两数大小的函数,函数有参数与返回值。C++程序设计中的函数可以分为两类:带参数的函数和不带参数的函数。这两种参数的声明、定义也不一样。
带有(一个)参数的函数的声明:
类型名标示符+函数名+(类型标示符+参数)
{
}
不带参数的函数的声明:
void+函数名( )
{
}
花括号内为函数体。
带参数的函数有返回值,不带参数的没有返回值。
C++中函数的调用:函数必须声明后才可以被调用。调用格式为:函数名(实参)调用时函数名后的小括号中的实参必须和声明函数时的函数括号中的形参个数相同。有返回值的函数可以进行计算,也可以做为右值进行赋值。
C语言中的部分函数:
main(主函数)
max(求最大数的函数)
scanf(输入函数)
printf(输出函数)
韦宵汨助休铸琯版泫哎维底香戈速燮纯坐焜嵋服
c语言如何定义一个可变参数函数 如何调用其输入的参数 分别~
有专门的宏,处理可变参
void va_start( va_list arg_ptr, prev_param );type va_arg( va_list arg_ptr, type );void va_end( va_list arg_ptr );
一个简单的例子
void simple_va_fun(int i, ...){va_list arg_ptr;int j=0;va_start(arg_ptr, i);j=va_arg(arg_ptr, int);va_end(arg_ptr);printf("i=%d j=%d\bn", i, j);return;}int main(){ simple_va_fun(1); simple_va_fun(1,2); simple_va_fun(1,200); return 0;}
需要借用C语言的VA_LIST 宏定义,及相关操作来实现可变参数。
VA_LIST 所在头文件:#include ,用法如下:
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
(2)然后用VA_START宏初始化刚定义的VA_LIST变量;
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
(4)最后用VA_END宏结束可变参数的获取。
以下是一个自定义打印接口的实现:
int my_printf(const char *fmt, ...)//...表示参数可变{va_list args;//定义va_list static char gc_PrintfOutBuff[1000];va_start(args, fmt);//初始化vsnprintf((char *) gc_PrintfOutBuff, 1000, (char *) fmt, args);//这里没有使用VA_ARG取回单个变量,而是借用vsnprinf一次性读取。va_end(args);//结束获取puts("%s",(const char *)gc_PrintfOutBuff);//使用。return 0;}