关于va_start
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相关推荐
- va_start() va_end()函数应用
1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...); void foo(parm_list,...); 2:函数参数的传递原理 函数参数是以数据结构:栈的形 ...
- va_list和va_start和((A*)0)-a
C语言函数是从右到左入栈的 va_list ap;//=char *ap;(一个字符指针) va_start(ap,v) 中 ( ap = (va_list)_ADDRESSOF(v) + _INTS ...
- va_list、va_start和va_end使用
我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1.硬件平台的不同 2.编译器的不同,所以定义的宏也有所不同. 在ANSI C中,这些宏的定义位于stdar ...
- va_start和va_end使用详解
va_start和va_end使用详解 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个 ...
- 不确定函数参数个数时的处理,va_start和va_end使用详解
引出 在C中,当我们无法确定函数的所有实参的类型和数目时,可以用省略号指定参数表来处理,如: void foo(...); void foo(parm_list,...); 具体怎么使用呢,我 ...
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
参考: http://www.360doc.com/content/12/0309/10/4025635_192940551.shtml http://www.cnblogs.com/Annie ...
- 深度探索va_start、va_arg、va_end
采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有大家熟悉的函数printf().s ...
- va_list/va_start/va_arg/va_end深入分析
va_list/va_start/va_arg/va_end这几个宏,都是用于函数的可变参数的. 我们来看看在vs2008中,它们是怎么定义的: 1: ///stdarg.h 2: #define v ...
- va_start、va_end、va_list的使用
http://www.cnblogs.com/rainduck/archive/2010/11/10/1873417.html 1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表 v ...
- 可变参数列表(va_list,va_arg,va_copy,va_start,va_end)
本文转自:http://blog.csdn.net/costa100/article/details/5787068 va_list arg_ptr:定义一个指向个数可变的参数列表指针: va_sta ...
最新文章
- 使用容器的正确方式,Docker在雪球的技术实践
- 微信公众号可快速创建“门店小程序” 不用开发
- JAVA中复制数组的方法
- Ubuntu15.04 网站服务器环境搭建,php/html/css等学习环境搭建教程
- 实践分享:开始用Cordova+Ionic+AngularJS开发App
- Android HttpClient
- .NET MVC权限控制设计
- adobe creative cloud的开机自启如何阻止
- 新手练字又快又好的方法
- 超键、候选键、主键区别?
- 优达(Udacity)customer_segments
- JS时间轴效果(类似于qq空间时间轴效果)
- linux把ftp挂载成盘符,使用curlftpfs将ftp空间挂载到本地
- 爬虫 爬取百思不得姐网站
- 表格内容相同单元格合并
- Python 解决报错NameError: name ‘LEFT‘ is not defined
- Background sticky concurrent mark sweep GC freed 842(58KB) AllocSpace objects
- 金庸群侠传之武林浩荡1.7全隐藏完整攻略流程(图文)
- Jupyter打开图形界面并画出正弦函数图像
- 结合公众号进行展会签到及抽奖
热门文章
- 强化学习在阿里广告排序和竞价中的应用
- 第二篇:猴博士求极限[2021.7.12完成]
- 【复习回顾、继承、抽象类、模板设计模式】
- 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第十三集
- 因聚而变——“聚·变”
- 机器学习-分类模型-置信概率
- 个人界面 头像 图片选择(相册,拍照)--如何调用系统的相册,裁剪并且上传
- php 教师批改作业代码,html5 canvas做批改作业的小插件代码示例
- python下载无法安装_各种版本的python下载安装教程
- 基于Python的ZED2教程 3.深度感知