码迷,mamicode.com
首页 > 其他好文 > 详细

宏可变参数列表

时间:2015-06-27 11:17:30      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

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获取各个参数。

 

 

[cpp] view plaincopy
 
  1. #include<stdio.h>  
  2. #include <stdarg.h>  
  3.   
  4. void arg_cnt(int cnt, ...)  
  5. {  
  6.     int value=0;  
  7.     int i=0;  
  8.     int arg_cnt=cnt;  
  9.     va_list arg_ptr;  
  10.     va_start(arg_ptr, cnt);  
  11.     for(i = 0; i < cnt; i++)  
  12.     {  
  13.         value = va_arg(arg_ptr,int);  
  14.         printf("value%d=%d\n", i+1, value);  
  15.     }  
  16.     va_end(arg_ptr);  
  17. }  
  18.   
  19. int main(void)  
  20. {  
  21.         arg_cnt(5,1,2,3,4,5);  
  22.         return 0;  
  23. }  

运行上面的程序:

 

value1=1
value2=2
value3=3
value4=4
value5=5

你发现这个程序有什么不方便的地方了吗?

对!就是要在第一个参数指定可变参数的数量,就是arg_cnt函数中的cnt变量,

如果我在main中调用

[cpp] view plaincopy
 
  1. <span style="font-size:10px;">arg_cnt(6,1,2,3,4,5);</span>  

 

那么结果就是没法预测了。

 

下面再介绍一个vsnprintf函数,该函数支持可变参数,说明如下:

 

头文件:
#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的字符被截断,如果输出过程中遇到错误,则返回一个负数。

 

 

[cpp] view plaincopy
 
  1. #include<stdio.h>  
  2. #include <stdarg.h>  
  3.   
  4. #define bufsize 80  
  5. char buffer[bufsize];  
  6.   
  7. int vspf(char *fmt, ...)  
  8. {  
  9.         va_list argptr;  
  10.         int cnt;  
  11.         va_start(argptr, fmt);  
  12.         cnt = vsnprintf(buffer,bufsize ,fmt, argptr);  
  13.         va_end(argptr);  
  14.         return(cnt);  
  15. }  
  16.   
  17. int main(void)  
  18. {  
  19.         int inumber = 30;  
  20.         float fnumber = 90.0;  
  21.         char string[4] = "abc";  
  22.         int cnt = 0;  
  23.         cnt = vspf("%d %f %s", inumber, fnumber, string);  
  24.         printf("%s\n", buffer);  
  25.         printf("cnt=%d\n", cnt);  
  26.         return 0;  
  27. }  

执行结果如下:
30 90.000000 abc
cnt=16

宏可变参数列表

标签:

原文地址:http://www.cnblogs.com/QingCHOW/p/4603749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!