C语言可变参数的实现机制
来源:互联网 发布:视频解码软件 编辑:程序博客网 时间:2024/05/28 03:02
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
va_list:用来保存宏va_start、va_arg和va_end所需信息的一种类型。为了访问变长参数列表中的参数,必须声明
va_list类型的一个对象 定义: typedef char * va_list;
va_start:访问变长参数列表中的参数之前使用的宏,它初始化用va_list声明的对象,初始化结果供宏va_arg和
va_end使用;
va_arg: 展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用va_arg都会修改
用va_list声明的对象,从而使该对象指向参数列表中的下一个参数;
va_end:该宏使程序能够从变长参数列表用宏va_start引用的函数中正常返回。
va在这里是variable-argument(可变参数)的意思.
这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.
#include <stdio.h>; #include <string.h>; #include <stdarg.h>; /* ANSI标准形式的声明方式,括号内的省略号表示可选参数 */ int demo(char *msg, ... ) { va_list argp; /* 定义保存函数参数的结构 */ int argno = 0; /* 纪录参数个数 */ char *para; /* 存放取出的字符串参数 */ /* argp指向传入的第一个可选参数, msg是最后一个确定的参数 */ va_start( argp, msg ); while (1) { para = va_arg( argp, char *); /* 取出当前的参数,类型为char *. */ if ( strcmp( para, "/0") == 0 ) /* 采用空串指示参数输入结束 */ break; printf("Parameter #%d is: %s/n", argno, para); argno++; } va_end( argp ); /* 将argp置为NULL */ return 0; }void main( void ) { demo("DEMO", "This", "is", "a", "demo!" ,"333333", "/0"); }
从这个函数的实现可以看到,我们使用可变参数应该有以下步骤:
1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变
量是指向参数的指针.
2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第
一个可变参数的前一个参数,是一个固定的参数.
3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个
参数是你要返回的参数的类型,这里是int型.
4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使
用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获
取各个参数.
2.存在的陷阱:va_arg宏的第2个参数不能被指定为char、short或者float类型。在C语言中,调用一个不带原型声明的函数时,调用者会对每个参数执行“默认实际参数提升(default argument promotions)”。
转自:http://blog.csdn.net/weiwangchao_/article/details/4857567
- C语言可变参数的实现机制
- C语言可变参数函数的实现
- C语言可变参数函数的实现
- C语言可变参数的函数实现
- c语言中可变参数的实现
- C语言可变参数的实现详解
- C语言中可变参数的实现
- C语言可变参数的实现详解
- C语言可变参数函数的实现
- C语言中可变参数的实现
- C语言可变参数函数的实现
- C语言可变参数实现
- C语言的可变参数
- C语言的可变参数
- c语言的可变参数
- c语言的可变参数
- C语言的可变参数
- C语言的可变参数的实现的原理
- HDU 2795——Billboard(线段树)
- python链接oracle数据库
- 多线程互斥与同步
- 可怕的中国人逻辑缺陷,你了解多少?
- 【算法导论学习-28】Fibonacci数列及其相关
- C语言可变参数的实现机制
- Firefox中文件下载JS
- eclipse 各个版本的比较
- 【DP】UVA 10651 Pebble Solitaire 记忆化搜索
- Codeforces 132C. Logo Turtle
- [Dahua Lin] Computer Vision的尴尬
- 晶振参数校定
- IOS开发常用工具网站地址
- 看代码学C++