首页 热点专区 义务教育 高等教育 出国留学 考研考公

...ansidecl.h中定义的宏VA_OPEN和VA_FIXEDARG和VA_CLOSE表示什么...

发布网友

我来回答

1个回答

热心网友

这个是用于处理可变参数的,其实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;i<num;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函数

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com