新闻资讯
看你所看,想你所想

va_end

va_end

由于在C语言中没有函式重载,解决不定数目函式参数问题变得比较麻烦;即使採用C++,如果参数个数不能确定,也很难採用函式重载.对这种情况,有些人採用指针参数来解决问题。下面就c语言中处理不定参数数目的问题进行讨论。

基本介绍

  • 外文名:va_end
  • 属于:C语言
  • 宏原型:type va_arg
  • 类别:可变数目变元

简介

“C语言”可变数目变元
宏va_arg()、va_start()和va_end()一起使用,便可以完成向函式传入数目可变的变元操作。取可变数目变元的典型例子是函式printf()。类型va_list是在<stdarg.h>中定义的。

宏原型

上述的宏原型如下所示:
type va_arg(va_list argptr, type);
void va_end(va_list argptr);
void va_start(va_list argptr, last_parm);
它们都包含在头档案<stdarg.h>中。

创建

创建一个能获取可变数目变元的函式的通用过程:在函式定义中,可变参数表之前必须有一个或多个已知参数,其中最右者为last_parm。在调用va_start()时,last_parm名被用作第二个参数。
任何可变长度的变元被访问之前,必须先用va_start()初始化变元指针argptr。初始化argptr后,经过对va_arg()的调用,以作为下一个参数类型的参数类型,返回参数。最后取完所有参数并从函式返回之前。必须调用va_end()。由此确保堆叠的正确恢复。
如果未正确使用va_end(),程式可能瘫痪。
例子:
用sum_series()求一系列的总和,sum_series()的第一个变元是数列项目数。本程式是求以下数列的前四项之和:
1/2+1/(2*2)+1/(2*2*2)...............
#include <stdio.h>#include <stdarg.h>double sum_series(int num, ...);int main(){  double d;  d= sum_series(4, 0.5, 0.25, 0.125, 0.06254);  printf("Sum of series is %f.\n", d);  return 0;}double sum_series(int num, ...){  double sum= 0.0, t;  va_list argptr;  va_start(argptr, num);  for(; num; num--)  {    t= va_arg(argptr, double);    sum= sum+ t;  }  va_end(argptr);  return sum;}

定义

大家先看几宏.
在VC++6.0的include有一个stdarg.h头档案,有如下几个宏定义:
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

转载请注明出处海之美文 » va_end

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:ailianmeng11@163.com