在所有我们看到的到目前为止功能参数,函数将数量必须预先知道(即使他们有默认值)。然而,有一些情况下,这将是能够数目可变的参数传递给一个函数有用。C语言提供了特殊的说明符被称为椭圆(又名“……”),让我们这样做。
由于椭圆是很少使用的,危险的,我们强烈建议避免使用,这部分可以被认为是选择性阅读。
使用椭圆函数,采取的形式return_type function_name(argument_list,……)。argument_list是一个或多个固定参数,就像正常功能的使用。省略号(表示为一排三个周期)必须在函数的最后一个参数。任何传递函数的实参必须与argument_list。椭圆捕获任何额外的参数(如果有)。虽然它不是很准确,它是想的椭圆作为一个数组保存任何额外的参数超出了那些在argument_list概念有用。
了解椭圆的最好的方式是通过例子。让我们写一个简单的程序,使用椭圆。让我们说我们要写一个函数,计算出一系列整数的平均值。我们就这样做:
#include <cstdarg> // needed to use ellipses
// The ellipses must be the last parameter
double FindAverage(int nCount, ...)
{
long lSum = 0;
// We access the ellipses through a va_list, so let's declare one
va_list list;
// We initialize the va_list using va_start. The first parameter is
// the list to initialize. The second parameter is the last non-ellipse
// parameter.
va_start(list, nCount);
// Loop nCount times
for (int nArg=0; nArg < nCount; nArg++)
// We use va_arg to get parameters out of our ellipses
// The first parameter is the va_list we're using
// The second parameter is the type of the parameter
lSum += va_arg(list, int);
// Cleanup the va_list when we're done.
va_end(list);
return static_cast<double>(lSum) / nCount;
}
int main()
{
cout << FindAverage(5, 1, 2, 3, 4, 5) << endl;
cout << FindAverage(6, 1, 2, 3, 4, 5, 6) << endl;
}你可以看到,这个函数需要一个可变数量的参数。现在,让我们看看组件以弥补这个例子。
第一,我们要cstdarg包含头文件。这头_列表定义_ VA,VA和VA _发射端宏,这是我们需要使用参数访问是在椭圆的一部分。
然后,我们将使用我们的椭圆函数。记住的是,参数列表必须固定一个或更多的参数。在这个案例中,我们通过一个单一的整数的平均数是多少告诉美国。我是个椭圆的负担。
注意有没有名字的椭圆的参数。相反,我们访问的值,在通过一个特殊类型称为椭圆的VA _列表。它是有用的一个conceptually认为VA _列表作为一个椭圆点的指针是数组。第一,我们将_列表A VA,VE,我们所谓的“隐身”功能。
未来的事我们需要做的是补点在椭圆的参数列表。我们这样做_通过调用启动(VA)。VA _ start()需要两个参数:VA _列表的名称本身,和最后的非椭圆参数的函数。一次启动(VA)已被_ VA _列表,第一点在椭圆的参数。
得到的值的参数是有点_ VA的列表,我们使用_精氨酸(VA)。_精氨酸(VA)所以需要两个参数:VA _列表本身,和类型的参数,我们试图访问。注意_精氨酸(VA)所以动作列表的下一个_ VA在椭圆的参数。
最后,当我们做清洁,我们调用end(),_ VA和VA _列表作为参数。
为什么是危险的椭圆
椭圆的程序员提供了很多灵活的实施可以采取变量的函数的数量的参数。然而,这是一个非常危险的downsides一些灵活性。
正则函数的一个参数,使用一个编译器类型检查,确保函数参数类型匹配的参数类型的函数(或implicitly转换可以使他们的比赛)。这帮助确保你不通函数在整数的字符串时,它是希望,或反之亦然。然而,有没有注意,椭圆的参数类型声明。当使用的编译器是椭圆的,椭圆的参数suspends型检查。这意味着它是可以发送任何类型的椭圆的参数。然而,一个缺点是,编译器将不再可以告诉你,如果你调用函数与椭圆的参数是不意义的。当使用它是椭圆的,完全新的功能是确保来电称为椭圆的参数,功能和CAN的手柄。很显然,叶位的中心误差(特别是如果用户不是一个谁写的函数)。
让看一例:这是很微妙的错误
5588

被折叠的 条评论
为什么被折叠?



