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. go 变量在其中一个函数中赋值 另一个函数_go 学习笔记之仅仅需要一个示例就能讲清楚什么闭包...
  2. 计算机数据库基础知识笔记,计算机基础及技巧(我的电脑笔记,适合新手!包含使用电脑最基本的知识及DOS、网络及数据库等。)...
  3. python发邮件实例_python 发送邮件实例
  4. 第七章数组答案C语言,c语言复习题及答案第七章数组.docx
  5. vc可以实现对话框里显示html文档内容,也可以显示word内容吗,VC6中使用CHtmlView在对话框控制中显示HTML文档...
  6. button上传替换file上传按钮,并显示图片缩略图,纯jsp操作
  7. php导入导出xls表,TP5.0 PHPExcel 数据表格导出导入
  8. 图书管理系统【JavaWeb:部署开发环境、解决分类、图书、前台页面模块】
  9. 32位oracle_ORACLE如何优化代码将查询速度从5s提升到0.1s
  10. C语言实现数字串转数字
  11. 如何用ps做一个魔法棒
  12. JAVA高级架构师视频课程
  13. python-伪随机数生成器
  14. 《手Q Android线程死锁监控与自动化分析实践》
  15. 无法访问/opt/module/spark/jars/spa
  16. OpenCV4学习笔记(31)——视频背景、前景提取分离及运动检测
  17. [心得]互联网公司招聘要求中的技术整理
  18. 【苦练基本功】代码整洁之道 pt2(第4章-第6章)
  19. 【数学】二阶非齐次微分方程的解法
  20. mysql 验证用户名重复,Ajax案例——检验用户名是否重复

热门文章

  1. 马丁。路德。金的演讲词“I have a dream”
  2. 微信公众号开发教程[008]-消息管理-群发消息
  3. 计算机专业热门求职岗位排行榜
  4. selenium2读书笔记(四)启动Firefox设置profile加载插件
  5. python增删改查_Python 列表的增删改查
  6. 线性高斯反问题--广义逆
  7. 一起做RGB-D SLAM(8)
  8. 大一计算机课程word,(完整word版)大一大学计算机基础课程知识点(10页)-原创力文档...
  9. Linux之使用expect备份华为交换机配置
  10. 【FH-GFSK】FH-GFSK信号分析与盲解调研究