va_start宏

  • va_list 解决的问题
  • c中的变参?
  • stdarg.h头文件几个重要的宏 含义
  • 使用例子
    • 关于vsnprintf

偶然间按触到了va_list,这到底是个什么东西呢?好奇。

va_list 解决的问题

VA_LIST 是在C语言中解决变参问题的一组宏,在<stdarg.h>头文件下。

c中的变参?

其实是指的函数的形参无法全部列出类型和数目时的情形,典型就是打印函数的…;如:void bLogOut(uint8_t type, const char *ptr_file, const char *ptr_func, uint32_t line,const char *fmt, ...)用省略号指定参数表。
而va_list就是处理省略号里面的内容的。

stdarg.h头文件几个重要的宏 含义

typedef char* va_list;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。所以在调用参数表之前,定义一个 va_list 类型的变量
void va_start ( va_list ap, prev_param ); /* 对ap 进行初始化,让它指向可变参数表里面的第一个参数。第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数*/
type va_arg ( va_list ap, type );/*获取参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置;*/
void va_end ( va_list ap );/*获取所有的参数之后,我们有必要将这个 ap 指针关掉*/

使用例子

#include<stdio.h>
#include <stdarg.h>#define bufsize 80
char buffer[bufsize];int demo(char *fmt, ...)//至少一个确定的参数
{va_list argptr;//定义保存函数参数的结构int cnt;va_start(argptr, fmt);cnt = vsnprintf(buffer,bufsize ,fmt, argptr);//写入字符串bufferva_end(argptr);return(cnt);
}int main(void)
{int inumber = 30;float fnumber = 90.0;char string[4] = "abc";demo("%d %f %s", inumber, fnumber, string);printf("%s\n", buffer);return 0;
}

关于vsnprintf

vsnprintf和snprintf是C语言printf家族函数的成员,如下。

#include <stdio.h>int printf(const char *format, ...); //输出到标准输出int fprintf(FILE *stream, const char *format, ...); //输出到文件int sprintf(char *str, const char *format, ...); //输出到字符串str中int snprintf(char *str, size_t size, const char *format, ...); //按size大小输出到字符串str中以下函数功能与上面的一一对应相同,只是在函数调用时,把上面的...对应的一个个变量用va_list调用所替代。在函数调用前ap要通过va_start()宏来动态获取。
#include <stdarg.h>int vprintf(const char *format, va_list ap);int vfprintf(FILE *stream, const char *format, va_list ap);int vsprintf(char *str, const char *format, va_list ap);int vsnprintf(char *str, size_t size, const char *format, va_list ap);

关于va_start相关推荐

  1. va_start() va_end()函数应用

    1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...); void foo(parm_list,...); 2:函数参数的传递原理 函数参数是以数据结构:栈的形 ...

  2. va_list和va_start和((A*)0)-a

    C语言函数是从右到左入栈的 va_list ap;//=char *ap;(一个字符指针) va_start(ap,v) 中 ( ap = (va_list)_ADDRESSOF(v) + _INTS ...

  3. va_list、va_start和va_end使用

    我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1.硬件平台的不同 2.编译器的不同,所以定义的宏也有所不同. 在ANSI C中,这些宏的定义位于stdar ...

  4. va_start和va_end使用详解

    va_start和va_end使用详解 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个 ...

  5. 不确定函数参数个数时的处理,va_start和va_end使用详解

    引出   在C中,当我们无法确定函数的所有实参的类型和数目时,可以用省略号指定参数表来处理,如: void foo(...); void foo(parm_list,...);   具体怎么使用呢,我 ...

  6. 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法

     参考: http://www.360doc.com/content/12/0309/10/4025635_192940551.shtml http://www.cnblogs.com/Annie ...

  7. 深度探索va_start、va_arg、va_end

    采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有大家熟悉的函数printf().s ...

  8. va_list/va_start/va_arg/va_end深入分析

    va_list/va_start/va_arg/va_end这几个宏,都是用于函数的可变参数的. 我们来看看在vs2008中,它们是怎么定义的: 1: ///stdarg.h 2: #define v ...

  9. va_start、va_end、va_list的使用

    http://www.cnblogs.com/rainduck/archive/2010/11/10/1873417.html 1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表 v ...

  10. 可变参数列表(va_list,va_arg,va_copy,va_start,va_end)

    本文转自:http://blog.csdn.net/costa100/article/details/5787068 va_list arg_ptr:定义一个指向个数可变的参数列表指针: va_sta ...

最新文章

  1. 使用容器的正确方式,Docker在雪球的技术实践
  2. 微信公众号可快速创建“门店小程序” 不用开发
  3. JAVA中复制数组的方法
  4. Ubuntu15.04 网站服务器环境搭建,php/html/css等学习环境搭建教程
  5. 实践分享:开始用Cordova+Ionic+AngularJS开发App
  6. Android HttpClient
  7. .NET MVC权限控制设计
  8. adobe creative cloud的开机自启如何阻止
  9. 新手练字又快又好的方法
  10. 超键、候选键、主键区别?
  11. 优达(Udacity)customer_segments
  12. JS时间轴效果(类似于qq空间时间轴效果)
  13. linux把ftp挂载成盘符,使用curlftpfs将ftp空间挂载到本地
  14. 爬虫 爬取百思不得姐网站
  15. 表格内容相同单元格合并
  16. Python 解决报错NameError: name ‘LEFT‘ is not defined
  17. Background sticky concurrent mark sweep GC freed 842(58KB) AllocSpace objects
  18. 金庸群侠传之武林浩荡1.7全隐藏完整攻略流程(图文)
  19. Jupyter打开图形界面并画出正弦函数图像
  20. 结合公众号进行展会签到及抽奖

热门文章

  1. 强化学习在阿里广告排序和竞价中的应用
  2. 第二篇:猴博士求极限[2021.7.12完成]
  3. 【复习回顾、继承、抽象类、模板设计模式】
  4. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第十三集
  5. 因聚而变——“聚·变”
  6. 机器学习-分类模型-置信概率
  7. 个人界面 头像 图片选择(相册,拍照)--如何调用系统的相册,裁剪并且上传
  8. php 教师批改作业代码,html5 canvas做批改作业的小插件代码示例
  9. python下载无法安装_各种版本的python下载安装教程
  10. 基于Python的ZED2教程 3.深度感知