宏可变参数列表

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. void arg_cnt(int cnt, ...)
  4. {
  5. int value=0;
  6. int i=0;
  7. int arg_cnt=cnt;
  8. va_list arg_ptr;
  9. va_start(arg_ptr, cnt);
  10. for(i = 0; i < cnt; i++)
  11. {
  12. value = va_arg(arg_ptr,int);
  13. printf("value%d=%d\n", i+1, value);
  14. }
  15. va_end(arg_ptr);
  16. }
  17. int main(void)
  18. {
  19. arg_cnt(5,1,2,3,4,5);
  20. return 0;
  21. }

运行上面的程序:

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. #define bufsize 80
  4. char buffer[bufsize];
  5. int vspf(char *fmt, ...)
  6. {
  7. va_list argptr;
  8. int cnt;
  9. va_start(argptr, fmt);
  10. cnt = vsnprintf(buffer,bufsize ,fmt, argptr);
  11. va_end(argptr);
  12. return(cnt);
  13. }
  14. int main(void)
  15. {
  16. int inumber = 30;
  17. float fnumber = 90.0;
  18. char string[4] = "abc";
  19. int cnt = 0;
  20. cnt = vspf("%d %f %s", inumber, fnumber, string);
  21. printf("%s\n", buffer);
  22. printf("cnt=%d\n", cnt);
  23. return 0;
  24. }

执行结果如下:

30 90.000000 abc

cnt=16

时间: 2024-10-10 22:59:38

宏可变参数列表的相关文章

【C语言】可变参数列表。

(1)先看一个求平均值的函数 #include <stdio.h> double average(int val,int v1,int v2,int v3,int v4,int v5) { double sum = v1; if(val >= 2) sum += v2; if(val >= 3) sum += v3; if(val >= 4) sum += v4; if(val >= 5) sum += v5; return sum/val; } int main ()

【转】C++可变参数列表处理宏va_list、va_start、va_end的使用

VA_LIST是在C语言中解决变参问题的一组宏他有这么几个成员: 1)va_list型变量: #ifdef     _M_ALPHA typedef    struct{ char* a0; /*pointertofirsthomedintegerargument*/ int offset; /*byteoffsetofnextparameter*/ }va_list; #else typedef    char* va_list;#endif 2)_INTSIZEOF宏,获取类型占用的空间长度

C++可变参数列表处理宏va_list、va_start、va_end的使用

VA_LIST是在C语言中解决变参问题的一组宏他有这么几个成员: 1)va_list型变量: #ifdef     _M_ALPHA typedef    struct{ char* a0; /*pointertofirsthomedintegerargument*/ int offset; /*byteoffsetofnextparameter*/ }va_list; #else typedef    char* va_list;#endif 2)_INTSIZEOF宏,获取类型占用的空间长度

可变参数列表的实现

在学习C语言的过程中,大家是不是和我一样,认为printf是一个神一样的函数?他可以接受不同数目,不同类型的参数,他到底是怎么实现的呢? 让我们去看一下它的源代码: printf源代码: int printf(const char *fmt,...) { int res; va_list arg; va_start(arg,fmt); res = vprintf(fmt,arg); va_end(arg); return res; } 它采用的是可变参数列表,可变参数列表主要有以下两个缺点: 1

C语言函数可变参数列表

C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏va_start.va_arg.va_end: 可变函数参数定义方法: #include <stdarg.h> void func(int count,...){ va_list ap; int ix, tmp; va_start(ap, a); for(ix=0;ix < count; ++

可变参数列表

函数原型:列出了函数期望收到的参数数目及类型,但是它只能显示"固定数目"的参数. 可变参数列表:让一个函数在不同的时刻接受"不同数目"的参数.可变参数列表是通过宏来实现的,这些宏都在stdarg.h这个头文件中,所以使用可变参数列表时要引用头文件#include<stdarg>. 例如:求寻找一组整数中最小的值,因为整数的个数不确定,所以函数在传参的时候也是不确定的,因此需要用到可变参数列表: 利用可变参数列表求最小值:来看看可变参数列表的形式: int

浅析可变参数列表的使用

在我们使用函数时,一般大多数情况下里面的参数都是给定的,而且我们一般使用时并不会超过三个参数,可是这并不排除不会出现三个以上的参数,比如说求平均值,求和等等一些可能出现三个以上参数的函数运算,这时我们的参数不再是固定的,而是随时会不断变化的.因此我们就需要一种方法来实现它们,这种方法就是C语言给我们提供的一种叫做可变参数列表的函数方法. 首先,可变参数列表是通过宏来定义的,而这些宏又在<stdarg.h>的头文件中,因此我们在使用时要先引用该头文件,在引用后我们需要其下三个宏的函数: void

c语言中对可变参数列表的简单理解

函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头文件中声明了一个va_list类型和va_start.va_arg.va_end三个宏.我们使用可变参数列表的时候需要声明一个va_list类型的变量配合这三个宏使用. va_start(va_list变量名,省略号前面最后一个有名字的参数):在提取可变参数前必须调用这个宏实现初始化. va_arg

【C语言】printf函数的简单实现(可变参数列表)

stdarg宏: 可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件中,它是标准库的一部分.这个头文件声明一个类型va_list和三个宏va_start.va_arg和va_end.我们可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数. 声明一个va_list类型的变量arg,它用于访问参数列表的未确定部分.这个变量是调用va_start来初始化的.它的第一个参数是va_list的变量名,第2个参数是省略号前最后一个有名字的参数.初始化过程把var_arg变量设