【求解释va_list、va_start、va_arg、va_end】 前面声明过va_list ap;后面出现了va_start ...

作者&投稿:乌伯 (若有异议请与网页底部的电邮联系)
这些都C定义的一些宏
获取省略号指定的参数: 在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。
va_start使arg_ptr指向第一个可选参数。
va_arg返回参数列表中的当前参数并使arg_ptr指向参数列表中的下一个参数。
va_end把arg_ptr指针清为NULL。
函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。

C语言 函数变参数的问题(va_list,va_start,va_arg,va_end)~

va_start (ap, num);
这句话用错了,va_start 是用来初始化ap的,num应该改为传递的第一个对象,也就是item。
loc_item = va_arg(ap,Item);
这句的作用是loc_item 被赋给ap的下一对象的值。
#include
#include

typedef struct item
{
char name[20];
char kind[20];
}Item;

void showname (Item locitem,...);

void main ()
{
Item locitem1 = {"aaa","aaa"};
Item locitem2 = {"bbb","bbb"};
showname (locitem1,locitem2);
}

void showname (Item item,...)
{
va_list ap;
Item loc_item;

va_start (ap, item);//修改了这里
loc_item = va_arg(ap,Item);

printf("%s is %s
",loc_item.name,loc_item.kind);
printf("other:%s is %s
",item.name,item.kind);
va_end (ap);
}
显示结果为:
bbb is bbb
other:aaa is aaa

给个例子自己看:

四个重要的宏: va_list va_start va_arg va_end
va_list 定义了参数列表
va_start 指定列表开始的参数
va_arg 取出列表中的参数, 顺序为函数传递参数顺序(从左到右)
va_end 参数列表结束
举例:
#include
#include
using namespace std;
int add(int totalnum...)//totalnum指定了参数的个数,...表示参数不定, 为定义此类函数必需
{
va_list intlist;//定义参数表 intlist
va_start(intlist, totalnum);//指定开始参数为totalnum
int totaladd = 0;
for(int i=0;i<totalnum;i++)
{
totaladd += va_arg(intlist,int);//取出参数类型为int的参数 你说的fmt是参数的类型如float等
}
va_end(intlist);//参数取完
return totaladd;
}
void main()
{
cout<<add(5,1,2,3,4,5)<<endl;
}
答案为15

va_list是什么?变量?结构?在哪个头文件定义的?
答:头文件为#include 〈stdarg.h〉,是在C语言中解决变参问题的一组宏。在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。有些库中va_list实现为char* 指针,可变参数的函数原理其实很简单,而VA系列是以宏定义来定义的,实现跟堆栈相关。

typedef struct __va_list { void *__ap; } va_list什么意思
答:定义va_list为结构体struct __va_list { void *__ap; }的名字。因此,可以用 va_list astruct;来定义,代替 struct __va_list astruct;

va_list的用法
答:(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;(2)然后用VA_START宏初始化刚定义的VA_LIST变量;(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);(4)最后用VA_END宏结束可变...

关于C++的可变参数问题。
答:va_list用于存取可变参数。va_start用来初始化va_list变量。va_arg用来获取下一个可变参数。va_end用来反初始化va_list变量。va_arg函数根据当前给定的类型来取得当前指向的函数参数,并且递增内部的一个指针指向下一个参数。比如 va_arg(arguments, char*)这里假设当前参数是char*类型,并修改内部指针...

va_list,va_arg,va_end.有关问题.
答:这牵涉到C语言的汇编实现时的参数传递机制。简而言之,程序并不知道你的参数具体有多少个,因此只要内存中没有为0的字节,就会不停地读下去,最终引发内存错误。针对你的程序,解决方法就是在调用时,告诉被调函数参数的个数;或者,在函数调用的参数列表的最后,加上一个NULL作为参数。

C语言中,参数“...”是什么意思
答:定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_start 是在 stdarg.h 头文件中定义的。使用 va_arg 宏和 va_li...

前面声明过va_list ap;后面出现了va_start (ap, fmt),va_arg (ap, i...
答:using namespace std;int add(int totalnum...)//totalnum指定了参数的个数,...表示参数不定, 为定义此类函数必需 { va_list intlist;//定义参数表 intlist va_start(intlist, totalnum);//指定开始参数为totalnum int totaladd = 0;for(int i=0;i<totalnum;i++){ totaladd += va_...

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...

C++ 的 f(…) 什么意思?
答:va_list参数 例子:void log_print( const char* fmt, ... ){char buf[65535];va_list ap;va_start( ap, fmt );vsprintf( buf, fmt, ap );va_end( ap );printf(buf);} log_print( "%s%d", ret, log);

变元个数可变的函数问题,看不懂。
答:void va_start(va_list argptr, last_parm);它们都包含在头文件<stdarg.h>中。创建一个能获取可变数目变元的函数的通用过程:在函数定义中,可变参数表之前必须有一个或多个已知参数,其中最右者为last_parm。在调用va_start()时,last_parm名被用作第二个参数。使用任何可变长度的变元被访问之...