网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 106|回复: 0
打印 上一主题 下一主题

【C语言】可变参数的函数

[复制链接]

692

主题

699

帖子

3125

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3125
跳转到指定楼层
楼主
发表于 2024-12-24 17:46:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C 语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function)。这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数(optional argument)。

这种函数必须至少有一个强制参数。可选参数的类型可以变化。可选参数的数量由强制参数的值决定,或由用来定义可选参数列表的特殊值决定。

C 语言中最常用的可变参数函数例子是 printf()和 scanf()。这两个函数都有一个强制参数,即格式化字符串。格式化字符串中的转换修饰符决定了可选参数的数量和类型。

对于每一个强制参数来说,函数头部都会显示一个适当的参数,像普通函数声明一样。参数列表的格式是强制性参数在前,后面跟着一个逗号和省略号(...),这个省略号代表可选参数。

可变参数函数要获取可选参数时,必须通过一个类型为 va_list 的对象,它包含了参数信息。这种类型的对象也称为参数指针(argument pointer),它包含了栈中至少一个参数的位置。可以使用这个参数指针从一个可选参数移动到下一个可选参数,由此,函数就可以获取所有的可选参数。va_list 类型被定义在头文件 stdarg.h 中。

当编写支持参数数量可变的函数时,必须用 va_list 类型定义参数指针,以获取可选参数。在下面的讨论中,va_list 对象被命名为 argptr。可以用 4 个宏来处理该参数指针,这些宏都定义在头文件 stdarg.h 中:
  • void va_start(va_list argptr, lastparam);



宏 va_start 使用第一个可选参数的位置来初始化 argptr 参数指针。该宏的第二个参数必须是该函数最后一个有名称参数的名称。必须先调用该宏,才可以开始使用可选参数。
  • type va_arg(va_list argptr, type);



展开宏 va_arg 会得到当前 argptr 所引用的可选参数,也会将 argptr 移动到列表中的下一个参数。宏 va_arg 的第二个参数是刚刚被读入的参数的类型。
  • void va_end(va_list argptr);



当不再需要使用参数指针时,必须调用宏 va_end。如果想使用宏 va_start 或者宏 va_copy 来重新初始化一个之前用过的参数指针,也必须先调用宏 va_end。
  • void va_copy(va_list dest, va_list src);



宏 va_copy 使用当前的 src 值来初始化参数指针 dest。然后就可以使用 dest 中的备份获取可选参数列表,从 src 所引用的位置开始。

例 1 中的函数展示了这些宏的使用方法。

【例1】函数 add()
  • // 函数add() 计算可选参数之和
  • // 参数:第一个强制参数指定了可选参数的数量,可选参数为double类型
  • // 返回值:和值,double类型
  • double add( int n, ... )
  • {
  •   int i = 0;
  •   double sum = 0.0;
  •   va_list argptr;
  •   va_start( argptr, n );             // 初始化argptr
  •   for ( i = 0; i < n; ++i )       // 对每个可选参数,读取类型为double的参数,
  •     sum += va_arg( argptr, double ); // 然后累加到sum中
  •   va_end( argptr );
  •   return sum;
  • }




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2025-1-18 20:07 , Processed in 0.034725 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表