va_start、va_arg、va_end、va_copy 可变参函数
1、应用与原理
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
2、va_start、va_arg、va_end、va_copy介绍
#include <stdarg.h>
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);
typedef struct {
char *a0; /* pointer to first homed integer argument */
int offset; /* byte offset of next parameter */
} va_list;
*fmt, ...) 中的fmt。通过va_start初始化ap,我们就获得了可变参数前一个参数fmt的地址。
3、Example
//foo.c
#include <stdarg.h>
#include <stdio.h>
void
foo(char *fmt, ...)
{
va_list ap;
int d;
char c, *s;
va_start(ap, fmt);
while (*fmt)
switch (*fmt++) {
case 's': /* string */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
/* need a cast here since va_arg only
/* need a cast here since va_arg only
takes fully promoted types */
c = (char) va_arg(ap, int);
printf("char %c\n", c);
break;
}
va_end(ap);
}
//main.c
#include <stdio.h>
#include <stdarg.h>
#include "foo.h"
int
main(void)
{
foo("%s %d %c %d %c", "Hello", 4, 'x', 3, 'y');
return 0;
}
windeal@ubuntu:~/Windeal/apue$ ./exe
string Hello
int 4
char x
int 3
char y
windeal@ubuntu:~/Windeal/apue$
//foo.c
#include <stdarg.h>
#include <stdio.h>
void
foo(char *fmt, ...)
{
va_list ap;
int len = 0;
char buf[64];
va_start(ap, fmt);
len = vsnprintf(buf, 128, fmt, ap);
va_end(ap);
int i = 0;
for(i = 0; i < len; i++)
{
putchar(buf[i]);
}
return ;
}
// main.c
#include <stdio.h>
#include <stdarg.h>
#include "foo.h"
int
main(void)
{
foo("Test:%s %d %c %d %c\n", "Hello", 4, 'x', 3, 'y');
return 0;
}
windeal@ubuntu:~/Windeal/apue$ ./exe
Test:Hello 4 x 3 y
va_start、va_arg、va_end、va_copy 可变参函数va_start、va_arg、va_end、va_copy 可变参函数
va_start、va_arg、va_end、va_copy 可变参函数的更多相关文章
- va_start,va_arg,va_end的使用
一.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表. void fun(...); void fun(parm_list,...); #include <stdi ...
- va_list/va_start/va_arg/va_end深入分析【转】
转自:http://www.cnblogs.com/justinzhang/archive/2011/09/29/2195969.html va_list/va_start/va_arg/va_end ...
- C++省略参数(va_list va_start va_arg va_end)的简单应用
原文参考自:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html #include <iostream> #in ...
- va_list/va_start/va_arg/va_end深入分析
http://www.cnblogs.com/justinzhang/archive/2011/09/29/2195969.html
- va_start(),va_end()函数应用【转】
转自:http://www.cnblogs.com/gogly/articles/2416833.html 原理解释: VA_LIST 是在C语言中解决变参问题的一组宏,在<stdarg.h&g ...
- va_start(),va_end()函数应用
原理解释: VA_LIST 是在C语言中解决变参问题的一组宏,在<stdarg.h>头文件下. VA_LIST的用法: (1)首先在函数里定义一具VA_LIST型的变 ...
- 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的使用及原理. 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 ...
- [转载]va_start和va_end使用详解
va_start和va_end使用详解 原文地址:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html 本文主要介绍va_s ...
随机推荐
- pxe无人值守自动安装
rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpmyum listyum upda ...
- linux 安装vscode
滚动安装vscode 需要先添加源,然后install 以centos为例: sudo rpm --import https://packages.microsoft.com/keys/microso ...
- uboot的FIT功能
1.FIT介绍 Flattend Image Tree 英文原版介绍: FIT is formally a FDT, which can include images of various types ...
- html-w3c规范及常见标签
W3C提倡的web结构: 内容(HTML)与表现(css样式)分离 内容(HTML)与行为(JS)分离 HTML内容结构要求语义化 基本规范: 标签名和属性名称必须小写 HTML标签必须关闭 属性值必 ...
- JVM 内存调优 与 实际案例
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- 03_zookeeper伪集群安装
一句话说明白:在1台机器上模拟多台机器,对外提供服务 在理解zookeeper集群安装方法的基础上,本文描述如何将1个机器模拟为3个节点的zookeeper集群,建议先参考阅读本文的前一期 zooke ...
- Springcloud/Springboot项目绑定域名,使用Nginx配置Https
https://blog.csdn.net/a_squirrel/article/details/79729690 一.Https 简介(百度百科) HTTPS(全称:Hyper Text Trans ...
- PHP实体层基础类
PHP实体层基础类 class BaseModel { private $tableName; private $fields=array(); function __construct() { $t ...
- windows向github提交代码
随便写的,留给自己看. 一.在github上注册并建立自己的仓库http://www.cnblogs.com/keZhenxu94/p/5288488.html 二.安装windows版本git界面工 ...
- 对reducers 理解
var reducers = { totalInEuros : function(state, item) { return state.euros += item.price * 0.8974243 ...