c语言va_arg函数 c语言avg用法

【大神请进】c如何将 类型的名称 作为函数的参数传入接上一个人的回复c语言va_arg函数,va_arg这个宏是用来实现C语言里面的可变参数列表这个功能的c语言va_arg函数,本身只是一个宏函数,只是做字符串替换用的 。
C语言本身没有传递类型的功能,但是借助定义宏函数可以间接实现
c语言如何封装一个带有可变参数的方法?需要借用C语言的VA_LIST 宏定义,及相关操作来实现可变参数 。
VA_LIST 所在头文件:#include stdarg.h,用法如下:
(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;
}
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语言头文件ansidecl.h中定义的宏VA_OPEN和VA_FIXEDARG和VA_CLOSE表示什么这个是用于处理可变参数的,其实C标准只定义了
va_start
,
va_end
,
va_copy
,
va_arg
这几个宏,而
va_list
是一个存储可变参数信息的对象 。
va_start
用于初始化可变参数列表
va_copy
将参数列表拷贝一份,而不直接使用源参数列表 , 当然,这个拷贝参数列表中的参数信息和源列表是一样的 。
var_arg
抽取参数列表中的下一个参数
var_end
用于结束参数处理(如果函数调用了va_start,在函数返回之前应该调用va_end结束本次处理) 。
egg.
void
printInt(int
num,
...)
{
va_list
ap;//用于存储可变参数的信息的列表
var_start(ap,num);//初始化参数列表,你要告诉var_start,最后一个已命名的参数是哪一个(其实就是
...
前面的那个),这里就是num,因为va_start内部要找到可变参数的首地址 , 所以要知道从哪个地址开始是可变参数的地址,这里传递num,也就是从地址num 1开始作为可变参数的地址 。可变参数信息会存在ap这个list中
for(int
i=0;inum;i)
{
int
val=var_arg(ap,int);//使用va_arg宏从参数列表ap中取出一个参数,由于宏并不知道我们传递的参数的类型,所以它无法返回 , 所以你要告诉它参数是什么类型的,然后它就返回一个这种类型的参数值给你,参数列表内部维护一个指针,用于指示当前处理到哪个地址,调用va_arg后指针会移动到下一个参数的位置,那么它怎么知道下一个参数在哪里?你告诉它参数类型是什么,它就会向后移动这个参数类型所占的字节数 , 例如你从里面拿了一个int,那么它就 4,又从里面拿了一个char,它就 1 。每次调用完va_arg后,指针都是指向下一个待处理的参数的地址 。
printf("The
value
is:
%d
",val);
}
va_end(ap);//函数返回前 , 记得调用va_end这个宏来结束参数的处理,这个很重要 , 不要忘记 。
}
printInt(3,24,36,71);//
调用printInt函数
c语言va_arg使用va_arg是一个宏定义,用于处理函数不确定参数个数时,即可变参数列表时对参数的取用 。
1 头文件:
#include stdarg.h
2 形式:
type va_arg(va_list ap, type);
3 说明:
这个宏被展开成一个包含类型为type,值为ap的表达式 。参数ap应该首先被宏va_start 或 va_copy初始化,但又必须在被宏va_end调用之前使用 。每次调用va_arg都会改变ap值使得后续的参数值能被依次添加 。参数type应该是一个类型名,并且用type*能够得到该类型的指针类型 。如果type为空,或者type和实际参数不匹配,那么除了以下两种情况,这个宏的行为是未定义的 。
1) 一个是带符号整型,另一个是与之对应的无符号整型,并且值可以被表达成这两种类型的任何一种;
2) 一个是空类型指针,另一个是字符类型指针 。
第一次调用va_arg返回parmN之后的参数值,后续的调用依次返回剩下的参数值 。parmN应为函数中“...”前最后一个参数值 。
C语言怎么实现函数不定参数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 = https://www.04ip.com/post/start;
int nArgCount = 1;
va_start(arg_ptr,start);
while(nArgValue != -1)
{
printf("arg %d is:%d/n",nArgCount,nArgValue);
nArgValue=https://www.04ip.com/post/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(); 可变参数函数最少要有一个参数 。
}
【c语言va_arg函数 c语言avg用法】c语言va_arg函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言avg用法、c语言va_arg函数的信息别忘了在本站进行查找喔 。

    推荐阅读