使用有什么好处 可变函数
void fun(int i, ...);
而不是将指针传递给数组?
void fun(int i*);
什么是可变参数函数?
答案 0 :(得分:6)
您必须先显式创建数组。此外,如果您想指定不同类型的参数,则会出现问题。
变量函数不需要创建任何数组,它们可以处理不同的类型。
作为一个例子,如果我总是必须首先创建一些数组,我就无法使用printf
- 函数。
另一方面,在大多数情况下,我认为它只是一种语法糖的形式。
答案 1 :(得分:2)
指向数组的指针假定参数的预定义类型(或结构,如果它有几种不同的类型)。
如果您事先不知道参数的类型是什么,并且您使用预定义参数的提示来获取该知识(如printf
的格式字符串),则使用可变参数函数
答案 2 :(得分:2)
此外,您不希望在可变参数函数中传递数组,因为您还希望传递其大小。 e.g:
myfunction(int *pArray, int NumElements)
然而,重点是可变函数允许传递许多不同的类型。
答案 3 :(得分:2)
我建议您只需不使用可变参数函数。但它们可能很有用。例如,在模板元编程技术中实现编译时查询。
va_arg()
一次或省略va_end(ap)
调用可能会导致程序崩溃。 接近未定义行为的示例:
我的工作是在sqlite C api周围创建一个面向对象的包装器。 我在这里:我创建了一个用于执行sqlite查询的奇特界面,就像这样:
void Query(const std::string& Query, void* Arguments, ...);
这一方面很棒而且很奇特但是:如果您的参数类型错误,您会立即遇到未定义的行为。例如:
db->Query("select * from northwind where id = ?", "Peter"); // espects int as type
会导致未定义的行为。