c语言标准库详解(十一):可变参数表<stdarg.h>

概述

头文件<stdarg.h>提供了遍历未知数目的函数参数表的功能。
假定函数 f 带有可变数目的实际参数,lastarg 是它的最后一个命名的形式参数。那么, 在函数 f 内声明一个类型为 va_list 的变量 ap,它将依次指向每个实际参数:

va_list ap;

在访问任何未命名的参数前,必须用va_start宏初始化ap一次:

va_start(va_list ap, lastarg);

此后,每次执行宏va_arg都将产生一个与下一个未命名的参数具有相同类型和数值的值,它同时还修改ap,以使得下一次执行va_arg时返回下一个参数:

type va_arg(va_list ap, type);

在所有的参数处理完毕之后,且在退出函数f之前,必须调用宏va_end一次,如下所示:

void va_end(va_list ap);

示例

va_start()宏

代码:

#include<stdarg.h>
#include<stdio.h>
int sum(int, ...);
int main(void)
{printf("11、45 和 14 的和 = %d\n",  sum(3, 11, 45, 14) );printf("1、91、98 和 10 的和 = %d\n",  sum(4, 1, 91, 98, 10) );return 0;
}
int sum(int num_args, ...)
{int val = 0;va_list ap;int i;va_start(ap, num_args);for(i = 0; i < num_args; i++){val += va_arg(ap, int);}va_end(ap);return val;
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-nsf2g1wd.aom' '--stdout=Microsoft-MIEngine-Out-xtkvmvlx.rhy' '--stderr=Microsoft-MIEngine-Error-dimeiy0i.hlj' '--pid=Microsoft-MIEngine-Pid-v0fnxhfb.y5l' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi'
11、45 和 14 的和 = 70
1、91、98 和 10 的和 = 200
PS G:\CSAPP> 

va_arg()宏

代码:

#include <stdarg.h>
#include <stdio.h>
int sum(int, ...);
int main()
{printf("114 和 514 的和 = %d\n",  sum(2, 114, 514) ); //永 不 磨 灭 的 番 号return 0;
}
int sum(int num_args, ...)
{int val = 0;va_list ap;int i;va_start(ap, num_args);for(i = 0; i < num_args; i++) {val += va_arg(ap, int);}va_end(ap);return val;
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-01flrijp.a45' '--stdout=Microsoft-MIEngine-Out-mjemdttq.ipe' '--stderr=Microsoft-MIEngine-Error-2vfrxmaj.csn' '--pid=Microsoft-MIEngine-Pid-okoojwvx.nv2' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi'
114 和 514 的和 = 628
PS G:\CSAPP>

va_end()宏

代码:

#include <stdarg.h>
#include <stdio.h>
int mul(int, ...);
int main()
{printf("114 * 514 = %d\n",  mul(2, 114, 514) );  return 0;
}
int mul(int num_args, ...)
{int val = 1;va_list ap;int i;va_start(ap, num_args);for(i = 0; i < num_args; i++) {val *= va_arg(ap, int);}va_end(ap);return val;
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-frj4ys0r.0av' '--stdout=Microsoft-MIEngine-Out-rewc5x2u.1xl' '--stderr=Microsoft-MIEngine-Error-5f2rj0xw.21y' '--pid=Microsoft-MIEngine-Pid-bvuls3w2.b1h' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi'
114 * 514 = 58596
PS G:\CSAPP> 

c语言标准库详解(十一):可变参数表stdarg.h相关推荐

  1. c语言标准库详解(十二):非局部跳转setjmp.h

    c语言标准库详解(十二):非局部跳转<setjmp.h> 概述 头文件<setjmp.h>中的声明提供了一种不同于通常的函数调用和返回顺序的方式,特别是,它允许立即从一个深层嵌 ...

  2. c语言标准库详解(八):数学公式math.h

    c语言标准库详解(八):数学公式<math.h> 概述 头文件<math.h>中声明了一些数学函数和宏. 宏 EDOM 和 ERANGE(在头文件<error.h> ...

  3. c语言标准库详解(十五):limits.h与float.h

    c语言标准库详解(十五):<limits.h>与<float.h> 概述 <limits.h> 头文件<limits.h>定义了一些表示整型大小的常量. ...

  4. c语言标准库详解(七):字符串函数string.h

    c语言标准库详解(七):字符串函数<string.h> 头文件<string.h>中定义了两组字符串函数.第一组函数的名字以 str 开头:第二组函数的名字以 mem 开头.除 ...

  5. c语言标准库详解(十四):时间函数time.h

    c语言标准库详解(十四):时间函数<time.h> 概述 头文件<time.h>中声明了一些处理日期与时间的类型和函数.其中的一些函数用于处理当地时间,因为时区等原因,当地时间 ...

  6. c语言标准库详解(零):总述

    c语言标准库详解(零):总述 关于标准库 标准库不是C语言本身的构成部分,但是支持标准C的实现会提供函数库中的函数声明.类型以及宏定义 标准库的内容 标准库中的函数.类型以及宏分别在下面的标准头文件中 ...

  7. matlab中sinks,MATLAB Simulink模块库详解(二)Sinks篇

    MATLAB Simulink模块库详解(二)Sinks篇 Simulink模块库概述 1.Sources模块库,为仿真提供各种信号源 2.Sinks模块库,为仿真提供输出设备元件 3.Continu ...

  8. STM32 HAL库详解 及 手动移植

    源: STM32 HAL库详解 及 手动移植

  9. stm32 IOT_基于STM32平台的cubeMX和HAL库详解

    课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...

最新文章

  1. echarts X轴 或者 Y轴 添加标识线
  2. 脑机接口技术重大突破!首次帮助瘫痪男子恢复运动和触觉
  3. python基础知识资料-Python基础知识篇 列表简介
  4. 全局程序集缓存gac中安装程序集_我就不信2W字把源码拆的这么碎,你还不明白mybatis缓存...
  5. SpringMvc入门教程
  6. C 语言的可变参数表函数的设计
  7. vGPU作为主流平台的进化之路
  8. 记录某对比软件注册 版本4
  9. Xamarin效果第五篇之ScrollView动态滚动效果
  10. dwz java_dwz.cn接口java客户端实现
  11. html alert 确认加事件,js事件中有alert执行顺序的问题
  12. sublime中的emmet插件的使用技巧
  13. 转DateTimePicker 控件的使用
  14. JSON格式化软件 - 开源工具 JSON Viewer
  15. 转动惯量和电机的选型
  16. nginx 安装和使用godaddy颁发证书
  17. 做科研的几点体会:如何多发 SCI
  18. C#语言 Asp.net旅游网站在线旅游信息网站(旅游系统旅游网站)旅游管理系统旅游景区旅游网站
  19. python爬虫爬取安居客并进行简单数据分析
  20. 20145240 《信息安全系统设计基础》第六周同学问题总结

热门文章

  1. pyqt5 python版本_PyQt5下载-Qt库的Python版本 v5.8.2免费版 - 安下载
  2. 单片机应用技术c语言版考试答案,单片机应用技术(C语言)试题
  3. LaTex数学公式中常用的符号及标记
  4. 前身黑客安全网“营销中国”即将关闭网站
  5. Piwigo 开源相册系统 v13.2.0
  6. 2020起重机司机(限桥式起重机)模拟考试题及起重机司机(限桥式起重机)复审模拟考试
  7. 基于Quick-cocos2d-x的资源更新方案 二
  8. 基于PM8916 MPP创建一个Linux led子系统
  9. 徐鑫 计算机科学与技术 2008,徐新
  10. 高中计算机学科知识,2020下半年教师资格统考《高中信息技术学科知识与教学能力》试题答案及解析...