内容来自《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. Python3-sqlalchemy-orm 回滚

    #-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...

  2. MySQL的主从复制步骤详解及常见错误解决方法

    mysql主从复制(replication同步)现在企业用的比较多,也很成熟.它有以下优点: 1.降低主服务器压力,可在从库上执行查询工作. 2.在从库上进行备份,避免影响主服务器服务. 3.当主库出 ...

  3. SpringBoot笔记(1)

    一.Spring能做什么 微服务 响应式开发 分布式云开发 web开发 无服务开发(云) 批处理业务等 二.SpringBoot作用 能快速创建出生产级别的Spring应用 SpringBoot是整合 ...

  4. Pulsar の 保证消息的顺序性、幂等性和可靠性

    原文链接:Pulsar の 保证消息的顺序性.幂等性和可靠性 一.背景 前面两篇文章,已经介绍了关于Pulsar消费者的详细使用和自研的Pulsar组件. 接下来,将简单分析如何保证消息的顺序性.幂等 ...

  5. Python - repr()、str() 的区别

    总的来说 str():将传入的值转换为适合人阅读的字符串形式 repr():将传入的值转换为 Python 解释器可读取的字符串形式 传入整型 # number resp = str(1) print ...

  6. 记录一次sql注入绕过

    目标:http://www.xxxxx.net/temp.asp?ID=10359 通过 and 1=1 and 1=2 测试发现存在拦截 首先想到 and 空格 = 可能存在触发规则 一般遇到这种情 ...

  7. 使用Dockerfile Maven插件

    我们常见开源项目中使用的Docker Maven插件是com.spotify:docker-maven-plugin.可用版本信息见Github. 通过其介绍可知该插件已经不再推荐使用,取而代之的是c ...

  8. 物理机burp抓虚拟机包

    先设置网络连接为NAT模式. 这就相当于主机虚拟出一个网卡,虚拟机单独成为一个网段(相当于虚拟机为单独一台主机,物理机作为路由器网关使用),我将会在物理机,也就是这个"路由器"上设 ...

  9. 解决百度ueditor插入动态地图空白 支持iframe方法

    说明:新版本ueditor要修改 xss过滤白名单 修改配置文件ueditor.config.js 搜索:  whitList 增加下面一行即可 ,whitList:{ iframe: ['frame ...

  10. Java基础系列(6)- 注释

    注释 平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了 注释不会被执行,是给开发人员看的 书写注释是一个非常好的习惯 Java中的注释有 ...