《c和指针》--宏可变参数
来源:互联网 发布:铁手苍狼淘宝 编辑:程序博客网 时间:2024/04/29 23:25
VA_LIST 是在C语言中解决变参问题的一组宏,定义在<stdarg.h>头文件下。
VA_LIST的用法:
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针
(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
(4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。
#include<stdio.h>#include <stdarg.h>void arg_cnt(int cnt, ...){ int value=0; int i=0; int arg_cnt=cnt; va_list arg_ptr; va_start(arg_ptr, cnt); for(i = 0; i < cnt; i++) { value = va_arg(arg_ptr,int); printf("value%d=%d\n", i+1, value); } va_end(arg_ptr);}int main(void){ arg_cnt(5,1,2,3,4,5); return 0;}运行上面的程序:
value1=1
value2=2
value3=3
value4=4
value5=5
你发现这个程序有什么不方便的地方了吗?
对!就是要在第一个参数指定可变参数的数量,就是arg_cnt函数中的cnt变量,
如果我在main中调用
arg_cnt(6,1,2,3,4,5);
那么结果就是没法预测了。
下面再介绍一个vsnprint函数,该函数支持可变参数,说明如下:
头文件:
#include <stdarg.h>
函数声明:
int vsnprintf(char *buffer, size_t max_count, const char *format, va_list vArgList);
参数说明:
char *buffer [out],把生成的格式化的字符串存放在这里.
size_t max_count [in], buffer可接受的最大字节数,防止产生数组越界.
const char *format [in], 格式化字符串
va_list vArgList [in], va_list变量. va:variable-argument:可变参数
用法类似于vsprintf,只不过加了max_count的限制.
返回值说明:
如果成功调用此函数,返回写到buffer中的字符的个数(不包括结尾的'\0')。snprintf和vsnprintf函数不能够写多于size大小(包括结尾的'0')的字节数。如果输出因为以上原因被截断,返回成功写入buffer的字符数(不包括结尾的'\0'),如果有足够的内存空间的话。所以,如果返回值等于size或者大于size,表示输出到buffer的字符被截断,如果输出过程中遇到错误,则返回一个负数。
#include<stdio.h>#include <stdarg.h>#define bufsize 80char buffer[bufsize];int vspf(char *fmt, ...){ va_list argptr; int cnt; va_start(argptr, fmt); cnt = vsnprintf(buffer,bufsize ,fmt, argptr); va_end(argptr); return(cnt);}int main(void){ int inumber = 30; float fnumber = 90.0; char string[4] = "abc"; int cnt = 0; cnt = vspf("%d %f %s", inumber, fnumber, string); printf("%s\n", buffer); printf("cnt=%d\n", cnt); return 0;}
执行结果如下:
30 90.000000 abc
cnt=16
- 《c和指针》--宏可变参数
- C和指针之函数之可变参数
- C函数和宏中的可变参数
- C可变参数宏
- C宏 可变参数
- 可变参数宏.c
- C 可变参数宏
- C与指针学习笔记——可变参数和printf函数
- C语言可变参数宏
- C/C++可变参数宏
- C语言 可变参数宏
- c语言可变参数宏
- <C++> 可变参数宏定义
- C 参数可变宏使用
- 关于 C C++ 可变参数的 宏 和 函数
- C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用
- C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用
- C语言:可变参数宏以及##和#符的使用
- 一个分配固定大小块的内存池(memory pool) 的例子 FROM POCO
- Windows Phone 7 MVVM模式通讯方式之实现Command
- xampp无法启动apache
- Windows Phone 7 MVVM模式通讯方式之实现Command
- ibatis配置文件-高级应用
- 《c和指针》--宏可变参数
- oracle剪切字符串
- Linux那些事儿之我是U盘(28)第一次亲密接触(四)
- linux删除文件夹操作命令
- tomcat WIN 7 一闪而过
- 关于IBATIS中SqlMap配置文件中resultType和resultMap的小差异
- 游戏行为模式——巴图模型
- imx515 开发板Android源代码编译过程
- 时间过的真快啊