可变参数简介

大多时候开发时函数入参数量是确定的,但在特定情况下会有可变数量参数的需求。
在C语言中提供了一个解决方案,需要引用头文件 :#include <stdarg.h>

一、函数接口介绍

  • 1、void va_start (va_list ap, last);
    ap:va_list 类型的变量,指向参数的指针
    last:最后一个显式声明的参数,以用来获取第一个变长参数的位置

  • 2、type va_arg(va_list ap, type);
    ap:va_list 类型的变量,指向参数的指针
    type:指要获取的参数的类型

  • 3、void va_end(va_list ap);
    ap:va_list 类型的变量,指向参数的指针

  • 4、void va_copy(va_list dest, va_list src);

  1. __va_start与va_end是成对被调用的,
  2. 开始的时候被调用va_start,获得各输出变量地址
  3. 结束的时候被调用va_end,释放相应的资源__

示例代码如下:

#include <stdio.h>
#include <stdarg.h>
double average(int num, ...)
{undefinedva_list valist;double sum = 0.0;int i; /* 为 num 个参数初始化 valist */ va_start(valist, num); /* 访问所有赋给 valist 的参数 */for (i = 0; i < num; i++){sum += va_arg(valist, int);}/* 清理为 valist 保留的内存 */va_end(valist);return sum/num;
}int main()
{undefinedprintf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}

设计日志打印函数时可使用这一特性,使用vsnprintf()实现snprintf()功能,示例代码如下:

void log_print(const char *format, ...)
{char errMsg[MSG_LEN] = {0};va_list ap;if (NULL == format){return;}va_start(ap, format); //获得可变参数列表vsnprintf (errMsg, MSG_LEN, format, ap); //写入字符串va_end(ap);//释放资源printf("%s", errMsg);//打印字符串
}int main()
{char *temp = "world";char *temp1 = "world !!";log_print("hello %s", temp );log_print("hello %s %s", temp , temp1);return 0;
}

linux C 可变参数配合vsnprintf的使用相关推荐

  1. Linux 打印可变参数日志

    实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...

  2. linux c程序加args,C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用

    在阅读代码的时候,在一个宏定义语句中,发现了个之前未曾见过的编译器预定义宏:"__VA_ARGS__".当时,从代码语句中推测它代表宏参数:"-"(本文称之为省 ...

  3. 【读书笔记】【程序员的自我修养 -- 链接、装载与库(三)】函数调用与栈(this指针、返回值传递临时对象构建栈、运行库与多线程、_main函数、系统调用与中断向量表、Win32、可变参数、大小端

    文章目录 前言 介绍 内存 内存布局 栈与调用惯例 堆与内存管理 运行库 入口函数和程序初始化 C/C++运行库 运行库与多线程 C++全局构造与析构 fread 实现 系统调用与API 系统调用介绍 ...

  4. _vsnprintf在可变参数打印中的用法

    _vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 函数简介 编辑 头文件: #include <stdarg.h> 函数声明: int _ ...

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

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

  6. 可变参数__VA_ARGS__使用和va_list使用小结

    1. #用来把参数转换成字符串 #define P(A) printf("%s:%d\n",#A,A); #define SQUARE(x) printf("The sq ...

  7. c语言理解参数,c语言中对可变参数列表的简单理解

    函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头 ...

  8. C语言中可变参数列表

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105113526 可 ...

  9. 参数控制c语言代码走向,C语言可变参数完全解读

    本文转自:http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html 一.是什么 我们学习C语言时最经常使用printf()函 ...

最新文章

  1. Java学习总结:16
  2. 如何查看 phtml文件 并有代码颜色提示
  3. 南通工学院计算机97级,2021年南通理工学院录取结果查询网址入口及录取结果公布时间...
  4. 2011年9月19日 面试重点:asp.net运行原理和生命周期
  5. SSH中为什么action需要用多例而dao层和service层为什么就用单例就可以
  6. jetty java 禁用目录列表_java – 如何禁用Jetty的WebAppContext目录列表?
  7. LeetCode 1522. Diameter of N-Ary Tree(递归)
  8. java封装 1210 速记
  9. 全球唯一!华为nova5系列:有望搭载全新7nmSoC
  10. geohash美团附近酒店搜索-技术方案
  11. 舞伴配对问题c语言实训报告,数据结构-舞伴配对实训.docx
  12. 计算机一级考试有填空题嘛,计算机一级考试填空题
  13. javaweb_util_excel模板横向纵向循环
  14. sv常用的系统function/task(一)
  15. Hibernate之load和get的区别
  16. 游戏运营是什么?运营专员需要具备什么能力?
  17. python支持的编程方式包括,python的两种编程方式是什么
  18. HTML+CSS做的商城页面
  19. for循环canvas渲染图片
  20. 开启xmp1还是2_玩机鸭x:手机开启“强制进行GPU渲染”功能对手机有什么影响?...

热门文章

  1. poj 1833 排列 STL 全排列公式
  2. 解决:wamp一直显示橙色无法变绿
  3. AtCoder Beginner Contest 203 (Sponsored by Panasonic) A~E 题解
  4. springboot实现邮件任务(简单文本,图片附件,验证码模板)
  5. 关于apk签名文件格式从.keystore转换成.jks的记载
  6. python: numba 加速python的 for loop
  7. php redirect导致重复请求,微信公众平台网页登录授权多次重定向跳转,导致code使用多次问题...
  8. U盘安装DEEPIN的方法
  9. STM32 F4 OV2640摄像头学习笔记(二)
  10. 时间序列模型-ARIMA