详解可变参数列表
首先我是个渣渣,本文仅限参考,谢谢
stdarg宏
可变参数列表是通过宏来实现的,这些宏定义stdarg.h头文件,它是标准库的一部分。这个头文件声明了一个类型va_list和三个宏——va_start、va_arg、va_end。我们可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值。
下面的函数就是运用可变参数模拟实现
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>//可变参头文件
void print(const char*format,...)
{
va_list arg;
char*para=0;
va_start(arg,format);//用a_start来初始化arg
while(*format)
{
switch(*format)
{
case's':
para=va_arg(arg,char*);
while(*para)
{
putchar(*para);
para++;
}
break;
case'c':
utchar(va_arg(arg,char));
break;
default:
putchar(*format);
break;
}
format++;
}
va_end(arg);//用a_end来结束调用
}
int main()
{print("s ccc.\n","hello","b","i","t");
system("pause");
return 0;
}
这里用到了va_list,va_start,va_end,va_arg
1、函数声明了一个va_arg来访问可变参数未访问的地方,这个变量是用va_start来初始化的;
2、为了访问参数,需用va_arg来接受两个参数:a_list和列表中下一位的参数
3、最后调用完参数后,须调用a_end来结束调用
对于这些宏存在两个基本限制,
1、这些宏无法判断实际存在参数的数量
2、这些宏无法判断实际参数的类型