使用可变函数

时间:2011-09-15 08:22:25

标签: c++ c variadic-functions

使用有什么好处 可变函数

void fun(int i, ...);

而不是将指针传递给数组?

void fun(int i*);

什么是可变参数函数?

4 个答案:

答案 0 :(得分:6)

您必须先显式创建数组。此外,如果您想指定不同类型的参数,则会出现问题。

变量函数不需要创建任何数组,它们可以处理不同的类型。

作为一个例子,如果我总是必须首先创建一些数组,我就无法使用printf - 函数。

另一方面,在大多数情况下,我认为它只是一种语法糖的形式。

答案 1 :(得分:2)

指向数组的指针假定参数的预定义类型(或结构,如果它有几种不同的类型)。

如果您事先不知道参数的类型是什么,并且您使用预定义参数的提示来获取该知识(如printf的格式字符串),则使用可变参数函数

答案 2 :(得分:2)

此外,您不希望在可变参数函数中传递数组,因为您还希望传递其大小。 e.g:

myfunction(int *pArray, int NumElements)

然而,重点是可变函数允许传递许多不同的类型。

答案 3 :(得分:2)

我建议您只需不使用可变参数函数。但它们可能很有用。例如,在模板元编程技术中实现编译时查询。

  1. 由于编译器无法验证给定的可变参数调用 函数传递适当数量的参数或那些 参数有适当的类型。因此,运行时调用a 传递不适当参数的可变函数 未定义的行为。
  2. 在纯C环境中,可变参数函数别无选择,只能在其中 c ++你能找到面向对象的替代品(也是一个 问题)。
  3. 变量函数实现起来并不容易。无法初始化ap,一次调用va_arg()一次或省略va_end(ap)调用可能会导致程序崩溃。
  4. 接近未定义行为的示例:

    我的工作是在sqlite C api周围创建一个面向对象的包装器。 我在这里:我创建了一个用于执行sqlite查询的奇特界面,就像这样:

    void Query(const std::string& Query, void* Arguments, ...);
    

    这一方面很棒而且很奇特但是:如果您的参数类型错误,您会立即遇到未定义的行为。例如:

    db->Query("select * from northwind where id = ?", "Peter"); // espects int as type
    

    会导致未定义的行为。