内容来自《c和指针》,整理后方便个人理解

stdarg.h

菜鸟教程 - <stdarg.h>

类型
va_list
va_start
va_arg
va_end
#include <stdio.h>
#include <stdarg.h> float
average( int n_values, ...);/*省略号用于提示此处可能传递数量和类型未知的参数*/ int
main( int argc, int** argv )
{
printf("%f\n", average( 6, 1 , 2, 3, 4, 5, 6) ); return 0;
} float
average( int n_values, ...)
{
va_list var_arg;
/*
**声明一个va_list类型的变量用于访问参数列表未知部分
*/
int count;
float sum = 0; va_start( var_arg, n_values );
/*
**var_arg初始化,第1个参数是va_list类型的变量名,第2个参数是省略号之前最后一个有名字的参数
*/
for( count = 0; count < n_values; count++ ){
/*
**用n_values指定了实际传递的参数数量
*/
sum += va_arg( var_arg, int );
/*
**va_arg访问参数,接受va_list变量和参数列表下一个参数的类型,var_arg指向下一个可变参数
*/
} va_end( var_arg ); return sum / n_values;
}

注意事项

  1. var_arg的第1个参数是va_list类型的变量名,第2个参数是省略号之前最后一个有名字的参数
  2. 函数的原型至少要有一个有名字的参数来保证va_start的使用
  3. va_arg的参数是va_list类型的变量敏感和参数列表下一个参数的类型
  4. 参数列表中的可变参数部分并没有原型,所有的作为可变参数传递给函数的值都将执行缺省参数类型提升
  5. va_arg无法正确识别缺省参数类型提升。如果char,short和float被提升为int,double传递给函数,在va_arg中使用需要格外小心
  6. 在va_arg中使用错误的参数类型会导致C标准未定义的结果

C 可变参数列表 stdarg.h的更多相关文章

  1. 可变参数函数(stdarg.h)的使用

    2013/5/3记录: stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数.   stdar ...

  2. 关于可变参数列表stdarg

    1.对于可变参数 可变参数列表通过stdarg.h中的宏实现: 主要有一个va_list类型 三个宏:va_start,va_arg,va_end; va_start格式: va_start(argu ...

  3. 第 16 章 C 预处理器和 C 库(可变参数:stdarg.h)

    /*------------------------------------------------- varargs.c -- use variable number of arguments -- ...

  4. 可变参数列表与printf()函数的实现

    问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...

  5. 可变参数列表---以dbg()为例

    在UART驱动的drivers/serial/samsung.h中遇到如下定义: #ifdef CONFIG_SERIAL_SAMSUNG_DEBUG extern void printascii(c ...

  6. C语言函数可变参数列表

    C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏v ...

  7. C++可变参数列表处理宏va_list、va_start、va_end的使用

      VA_LIST是在C语言中解决变参问题的一组宏他有这么几个成员: 1)va_list型变量: #ifdef     _M_ALPHA typedef    struct{ char* a0; /* ...

  8. 【转】C++可变参数列表处理宏va_list、va_start、va_end的使用

    VA_LIST是在C语言中解决变参问题的一组宏他有这么几个成员: 1)va_list型变量: #ifdef     _M_ALPHA typedef    struct{ char* a0; /*po ...

  9. C利用可变参数列表统计一组数的平均值,利用函数形式参数栈原理实现指针运算

    //描述:利用可变参数列表统计一组数的平均值 #include <stdarg.h> #include <stdio.h> float average(int num, ... ...

随机推荐

  1. Linux centos7 复制,移动,删除文件或文件夹

    2021-08-121. 文件(文件夹)复制命令 # 命令格式 cp [-adfilprsu] 源文件(source) 目标文件(destination) cp [option] source1 so ...

  2. (二)羽夏看C语言——容器

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  3. Redis-技术专区-让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)【前篇】

    前言介绍 很多小伙伴都跟我说,redis中,ZSet(有序集合)是他们最陌生的集合,同时也是觉得特别复杂的集合之一,在开发过程中经常会用到它,而且也是大家最不太有把握使用的集合,所以笔者就从ZSet集 ...

  4. 【CSS】按钮

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. shell条件语句if

    1.单分支语句 if [ ];then 命令 fi if [ ] then 命令 fi 2.双分支语句 if [ ] then echo cmd1 else echo cmd2 fi 3.多分支语句 ...

  6. Linux触摸驱动分析

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 触摸屏基础知识 一.结构 上图是电阻触摸屏的一个侧面剖视图 ...

  7. Mybatis-Plus常用的查询方法--看这一篇就够了!!!

    前言: Mybatis-Plus作为Mybatis的增强,自己封装了很多简单还用的方法,来解脱自己写sql! 对于项目的搭建小编就不在说了,可以参考: SpringBoot+Mybatis-Plus的 ...

  8. Stream流思想和常用方法

    一.IO流用于读写:Stream流用于处理数组和集合数据: 1.传统集合遍历: 2.使用Stream流的方式过滤: 其中,链式编程(返回值就是对象自己)中,filter使用的是Predicate函数式 ...

  9. Servlet处理带尾部斜杠/的URI

    有一个需求:让一个Servlet能够同时处理形如/XXX/YYY和/XXX/YYY/的URI,即URI尾部的斜杠有没有都要能处理到. 很容易想到,做两个URL Pattern/XXX/YYY和/XXX ...

  10. Redis-初见

    目录 启动and连接 JRedis 宝塔 Redis.conf RDB AOF(Append Only File) 发布和订阅 主从复制 一主二从 复制原理 宕机后的手动配置主机 哨兵模式 Redis ...