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) )