zoukankan      html  css  js  c++  java
  • C语言-11-可变参数的实现方案

    概述

    • 某种情况下,我们可能需要一个具有可变参数的函数,C语言提供了一种标准的实现可变参数的方法
    • C语言实现可变参数的方案是基于标准库<stdarg.h>的
    • 可变参数的类型
      • 可变参数可以放在一个集合中,可以使用指针类型的参数或引用类型的参数来实现可变参数
      • 可变参数不可以放到一个集合中,可以使用C语言提供的标准方案来实现可变参数

    标准库 stdarg.h

    • stdarg.h中定义的内容
      • 一个类型
        • va_list,用来定义存放参数列表
      • 三个宏(用于获取参数个数未知的函数中的参数)
        • void va_start(va_list ap, last_arg)
          • 通常与 va_arg 和 va_end 配合使用,且必须在 va_arg 和 va_end 之前被调用
          • va_start 初始化 ap 变量(为 ap 变量分配内从空间),last_arg 为传递给函数的已知的固定参数列表中的最后一个。
          • ap变量用来存储通过 va_arg 获取额外参数时所必需的信息
        • type va_arg(va_list ap, type)
          • 检索函数参数列表中类型为 type 的下一个参数
        • void va_end(va_list ap)
          • 允许使用了 va_start 宏 的 带有可变参数的函数 返回,若函数返回之前没有调用 va_end,则函数返回的结果是未定义的

    实现方案

    • 形式

      • 实现可变参数的函数的参数列表通常包括以下两部分
        • 固定参数列表,通常包含可变参数的总个数信息(通常为固定参数列表中的最后一个参数,即省略号'...'前的那个参数)
        • 可变参数列表,使用省略号'...'表示
    • 步骤

      • 定义一个函数,最后一个参数为省略号'...',且省略号前的那个参数总是int类型,表示参数的总个数
      • 在函数定义中创建 va_list 类型变量,用来存储通过 va_arg 获取额外参数时所必需的信息
      • 使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表
      • 使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项
      • 使用宏 va_end 来清理赋予 va_list 变量的内存
    • 示例

      // 计算可变数量个参数的和
      int sum(int num, ...) {
          // 定义va_list类型变量
          va_list valist;
          int i;
          double sum = 0.0;
          // 初始化valist
          va_start(valist, num);
          // 获取参数列表中的每个项
          for (i = 0; i < num; i++) {
              sum += va_arg(valist, int);
          }
          // valist变量的内存
          va_end(valist);
          return sum;
      }
      // 实现可变参数的函数的使用示例
      int main(int argc, const char * argv[]) {
          printf("Sum of 4, 5, 6, 7 = %d
      ", sum(4, 4, 5, 6, 7));
          printf("Sum of 3, 6, 9 = %d
      ", sum(3, 3, 6, 9));
          return 0;
      }
      
  • 相关阅读:
    【原创】编程题练习:反转字符串中的单词
    【最近的学习安排】
    【转载】判断两个链表是否相交、一个链表是否有环
    获取字符串字节长度
    如何找到GridView里的控件,建立GridViewRow对象
    Flex和.NET协同开发利器FluorineFx Flex与.NET互操作
    两款基于Visual Studio开发Flex的插件
    Mysql:向信号量添加给定计数将导致其超出它的最大计数错误
    Sql Server数据库触发器实例
    国外一些知名ASP.Net开源CMS系统
  • 原文地址:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/lavende.html
Copyright © 2011-2022 走看看