stdarg.h这个头文件的作用_我岂是非人哉的博客-程序员宅基地

技术标签: C与python  

一、简单版本

http://www.runoob.com/cprogramming/c-standard-library-stdarg-h.html

作用:帮助不定长参数的使用

va_list:一个特殊的类型,在va_start(), va_arg(), va_end()这三个宏当中使用

va_start():开始不定长参数的使用

va_arg():读入不定长参数

va_end():结束不定长参数的使用

例如:有一个函数,有不定长参数

void foo(int, ...);

完整例子:

#include <stdio.h>
#include <stdarg.h>

void foo(int, ...);

int main(void) {
    double x = 1.1, y = 2.1, z = 3.9;
    double a = 0.1, b = 0.2, c = 0.3;

    puts("Three parameters: ");
    foo(3, x, y, z);

    puts("Six parameters: ");
    foo(6, x, y, z, a, b, c);

    return 0;
}

void foo(int len, ...) {
    va_list args;
    va_start(args, len);

    for(int j = 0; j < len; j++) {
        printf("%.1f\n", va_arg(args, double));
    }

    va_end(args);
}

 

二、使用vfprintf

http://www.cplusplus.com/reference/cstdio/vfprintf/

int vfprintf ( FILE * stream, const char * format, va_list arg );

该函数的功能是将字符串format输出到文件stream, 功能与printf差不多,唯一的区别是参数使用arg。这个函数会在内部自动扫过不定长参数arg,就像内嵌了va_arg()函数。所以调用完vfprintf之后,arg的状态可能会被改变(例如指向了后面的参数)。

同理,arg需要被va_start()初始化,并且由va_end()释放。

完整例子:

void emit(char *fmt, ...) {
    va_list args;
    va_start(args, fmt);
    vfprintf(output, fmt, args);
    fprintf(output, "\n");
    va_end(args);
}

emit("output 2 numbers: %d,%d", 1,2);

 

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ben1010101010/article/details/89222096

智能推荐

50个C/C++源代码网站-程序员宅基地

C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建议,以进一步加强这方面的清单。由于时间较长,有些网站可能已经无法打开。http://www.cppcourse.com/ -- C++教程网1、h

java 图片 白边,如何在Java中自动裁剪图像白色边框?-程序员宅基地

What's the easiest way to auto crop the white border out of an image in java? Thanks in advance...解决方案If you want the white parts to be invisible, best way is to use image filters and make white pixel..._java去除base64图片白边

如何通过mybatis返回oracle自增长id_mybatis oracle 自增id-程序员宅基地

大家都知道像mysql,serveSql这样的数据库都提供有自增id的功能,而像oracle这样的数据库采取的是序列的方式来实现自增主键的,所以如果通过mybatis插入一条数据后返回主键id的方式也是不同的,网上有很多种说法,大都没说太明白,下面举个例子,详细说明一下,避免再入坑建表语句CREATE TABLE sys_student(id int P..._mybatis oracle 自增id

PhpStorm - PHP类型提示_phpstorm @var-程序员宅基地

PHP作为弱类型语言在编写上有很多的优势,但是有时候作为弱类型确带来的类型无法明确的麻烦。不知道里面相关的类中有什么类型,当然其中不能单靠IDE来解决,有时候也是自己的这个代码设计的问题_phpstorm @var

前端 —— JavaScript 基础篇 18 -- window.pageYOffset_js pageyoffset-程序员宅基地

最近想仿照淘宝首页的侧边栏,写个简单的小例子。获取滚动条距离顶部的距离用到了window.pageYOffset 方法。window.pageYOffset返回文档当前沿垂直轴(即向上或向下)滚动的像素数,其值为0.0,表示该Document的顶部边缘当前与窗口内容区域的顶部边缘对齐。pageYOffset是scrollY的一个别名是 window的只读属性在IE9及以上、谷歌 、Safari、firefox,Opera(presto内核) 都支持 此语句window.pageYO..._js pageyoffset

List泛型集合之基本使用_list泛型的用法-程序员宅基地

List泛型集合之基本使用list< T >基本使用1.创建泛型集合首先引入命名空间:using System.Collections.Generic;List< 类型 > 集合名 = new List ();2.集合数据操作1.添加数据 集合名.Add(Value)`//往集合中添加数据; 往集合中添加,数据会不断添加到集合中,形成一种类似于排队的效果。2.查询数据_list泛型的用法

随便推点

新书推荐 |《TCP/IP详解 卷2:实现》-程序员宅基地

新书推荐《TCP/IP详解卷2:实现》长按二维码了解及购买网络专家、著名技术作家W.RichardStevens的传世之作;内容详尽且极具权威;被誉为TCP/IP领域的不朽名著。编..._top/ip 实现书

android 开发rom层,Android ROM 开发技能图谱-程序员宅基地

# Android ROM 开发技能图谱## 1. 操作系统* Ubuntu(首选)* MacOSX## 2. 编程语言* Java* JNI(务必掌握)* C++* C## 3. 源码### 3.1 管理方式* Codelines/Branches/Releases* Codenames/Tags/Build Numbers### 3.2 源码地址* [官方源码](https://android..._rom层

解决ubuntu输入正确密码不能进入系统的问题_ubuntu密码输入正确但无法进入-程序员宅基地

今天遇到了一个问题,我在ubuntu上配置完java的环境之后重启,输入密码点了enter,然后又返回到了输入密码的界面,循环往复。此问题的详细讲解请参考:点击打开链接我来说一下解决方法:1.在输入密码的界面上同时按下ctrl+alt+f1,进入非图形界面。2.刚进入到非图形化界面,首先看到的是,”ubuntu login:“。注意:在此处输入用户名。输入用户名然后点击enter。..._ubuntu密码输入正确但无法进入

linux下原始ip数据包包头(tcp头、udp头)的获取和分析_从ip头中取出tcp头-程序员宅基地

前言 在有些时候我们需要直接抓取并分析原始ip数据包(比如说netfilter内核框架中数据包的分析、原始套接字中数据包的分析),但是我们所能获得的ip数据包通常只是一个若干字节的在连续地址空间中存储的数据,比如存在数组char[MSG_SIZE]中,下面介绍如何分析原始ip数据包中的数据。 在开始分析包头之前我们假设原始ip数据包存储在缓存char buf[MSG_S_从ip头中取出tcp头

cesium obj格式转换为gltf、glb_obj转glb-程序员宅基地

刚接触cesium,cesium需要三维模型的格式是gltf、glb, 这里需要三维人员把模型导成obj格式,这里用到的工具是https://github.com/CesiumGS/obj2gltf,这个工具可以很好的把obj转换成cesium用到的格式。在下载好的obj2gltf, 安装好obj2gltf依赖,在这个根目录下打开cmd命令窗口,然后执行obj2gltf -i ./assets/file.obj -o ./assets/file.glb, 具体还是可以看obj2gltf相关文档,我这里._obj转glb

推荐文章

热门文章

相关标签