最近,学习了“可见参数列表”,忽然之间发现很喜欢它,哈哈~
现在,我们来谈谈它吧!
功能: 可以将函数以可见参数列表的形式实现,使得函数可以接受1个以上的任意多个参数。
应用:要使用可变参数列表,我们要对其原理及用法十分了解!
(1)要引用的头文件被封装在“stdarg.h“中。
(2)在应用时,首先,声明一个 va_list类型的变量 arg ,它用于访问参数列表的没有确定的部分,比如几个变量,什么类型等。
( 3 ) 初始化,变量arg是调用 va_start 来初始化的。它的第一个参数是 va_list 的变量名,第2个参数是省略号前最后一个有名字的参数。初始化过程把 arg 变量设置为指向可变参数部分的第一个参数。
( 4 )参数访问,为了访问参数,需要使用 va_arg ,这个宏接受两个参数: va_list 变量和参数列表中下一个参数的类型。
(5)最后,当访问完毕最后一个可变参数之后,我们需要调用 va_end 结束访问。
但应用可变参数列表是有限制的,
可变参数的限制:
注意:
(1)可变参数必须从头到尾逐个访问。如果访问了几个可变参数之后要
终止,这是可以的,但是,不能从一开始就访问参数列表中间的参数。
(2)参数列表中至少有一个命名参数。如果连一个命名参数都没有,就无法使用va_start。
(3)这些宏是无法直接判断实际存在参数的数量,且类型必须指定正确。
(4)这些宏无法判断每个参数的类型。
下面举个例子,用可变参数列表实现函数功能:两个整数比较大小。
#include<stdio.h>
#include<stdarg.h> //头文件
int Max(int n,...) //未知的参数
{
va_list arg; //创建可变参数列表的变量
int max = 0;
int i = 0;
va_start(arg,n); //初始化
max = va_arg(arg,int); //访问变量
for(i = 0; i<n-1; i++)
{
int tmp =va_arg(arg,int);
if(max <tmp)
{
max =tmp;
}
}
va_end(arg);
return max;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
printf("%d\n",Max(2,a,b));
return 0;
}
在发现用可变参数列表实现了个简单的函数功能时,感觉还是不错的哇~
下面,转到源码看看:
typedef char * va_list;
#endif /* _M_CEE_PURE */
#define _VA_LIST_DEFINED
#endif
#elif defined(_M_IX86)
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap) ( ap = (va_list)0 )
分析看看:
了解了源码的基本的过程,再返回头看上面写过的代码,理解的会更深入!