可变参数的函数

来源:互联网 发布:aso关键词优化 编辑:程序博客网 时间:2024/04/28 09:45

1、可变参数的概念
C语言中支持参数可变的函数,printf就是一个典型的参数可变函数,其函数原型如下:

#include <stdio.h>int printf(const char* format, ...);

printf函数的原型中第1个参数format是固定的,后面的参数个数和类型都是可变的。编译器使用三个点“…”作为参数的占位符,告知编译器第1个参数format的后面还可能会有若干的参数。

2、一个简单的可变参数的函数

#include <stdarg.h>#include <stdio.h>int print_args(int begin, ...){    va_list ap;    char* p;    int n;    va_start(ap, begin); /* 从可变参数的第一个参数开始遍历 */    p = va_arg(ap, char*); /* 得到第一个参数 */    n = 0;    while(p != NULL){ /* 可变参数以NULL结尾,在遇到NULL结束符之前输出所有的参数 */        n++; /* 累计参数的个数 */        printf("arg %d : %s\n", n, p); /* 输出每个参数 */        p = va_arg(ap, char*); /* 得到下一个参数 */    }    va_end(ap); /* 参数处理结束,做一些清理工作 */    return 0;}

print_args函数中的关键点解释如下:
- 标准头文件stdarg.h:这个头文件中定义了一系列的宏来处理这个可变长度的参数列表。如果需要实现一个可变参数的函数,该头文件必不可少。
- 类型va_list:这个类型定义在stdarg.h头文件中。va_list定义为这样一个数据类型,循环使用且每次指向一个可变的参数。因此该类型的变量代表整个参数列表。
- 宏va_start:va_start宏初始化一个va_list类型的变量,使其指向第1个可变的参数。经过初始化后,变量ap就可以代表整个参数列表了,因此该宏必须在使用参数列表之前使用。每个可变参数的函数的第1个参数必须固定,否则无法进行初始化,并且将变量ap指向该参数列表。
- 宏va_arg:宏va_arg返回一个可变长度参数的值并使ap指向下一个可变的参数,该宏使用一个类型名来确定要返回的类型和指针ap需要移动的字节单位
- 宏va_end:做一些必要的清理工作,需要在程序结束前使用。

可变参数的函数实现流程如下:

  • 使用va_start宏初始化va_list类型的变量,使其指向可变参数列表的头;
  • 使用va_arg宏得到每个可变参数并对其进行处理,当遇到一个结束标志时停止处理;
  • 使用va_end宏做清理工作。
0 0
原创粉丝点击