在我们用到的函数中 printf 中就用到了参数数目不定的函数,我们不去分析 printf 实现的原理,我们直接来说明如何编写参数可变的函数
我们先来看看一个简单的例子:
#include "stdio.h"
#include "string.h"
#include <stdarg.h>
int demo(char *a, ...);
int main(int argc, const char *argv[])
{
demo("1:DEMO", "2:lip", "3:xxx", "");
return 0;
}
int demo(char *a, ...)
{
va_list argp;
int argnum = 0;
char *para;
va_start(argp, a);
while (1)
{
para = va_arg(argp, char *);
if (strcmp(para, "") == 0)
break;
printf("parameter #%d is : %s\n", argnum, para);
argnum++;
}
va_end(argp);
}
程序的说明:
【1】在函数定义的时候,不确定有多少数目的参数的地方用“...”代替
【2】在函数实现的时候,需要先声明一个能指向占空间的指针 va_list,
【3】在要用到变量的地方,调用 va_start 将 va_list 指针指向 a变量的桟空间的下一个地址,
【4】调用 va_arg,va_arg的行为是将地址指针强制转化成 (char *),并且返回此地址上存放的类型为char * 的内容,然后指针指向下个地址
【5】别忘了释放指针 va_end
【6】还有写需要知道的知识是,一般桟的空间增长和指针的增长是相反的,参数存到栈的顺序是 从最后边 往前边存,即如fun(a, b, c, d),d先进栈然后c...,因此上边说明中指针指向下一个地址取出后边的参数就可以理解了吧