传递可变数量的参数功能 - 函数重载?

时间:2011-08-25 15:24:40

标签: c

使用stdarg.h我们可以使用可变数量的参数进行函数调用。这也被归类为函数重载吗?

7 个答案:

答案 0 :(得分:2)

通常,函数重载意味着根据给定的参数调用函数/方法的不同实例。使用C中的变量参数,无论参数列表如何,都会调用相同的函数。基于此,答案是“不”。函数本身当然可以模仿重载的行为(如果有1个参数,则执行A,如果有2个参数则执行B等),但它通常不会被称为“重载”。

答案 1 :(得分:1)

实际上,答案可能是“是”或“否”,具体取决于您对“函数重载”的定义。

从编译器的角度来看,只有一个函数被实例化。从用户的persepctive,你可以调用这个“重载”,但它既不是语言也不是编译器强制执行。

答案 2 :(得分:1)

如果您指的是实现,则编译器不会创建重载。变量参数函数使用va_start / va_arg / va_end来获取它们的参数。

答案 3 :(得分:1)

没有

重载意味着将根据参数的数量和/或类型调用不同的函数(某些语言也可以使用返回类型)。但在这种情况下,无论参数的数量如何,您都在调用相同的函数。

它不会比func(42)func(43)重叠。

请注意,C99确实具有行为的东西,就像一种狭隘的重载形式。如果您有#include <tgmath.h>,则sqrt(x)会调用三种不同功能之一(sqrtf()sqrt()sqrtl()),具体取决于x。但这实际上是一个“类型通用”,而不是一个重载函数。 C11添加了_Generic关键字,使此工具可供用户编写的代码使用。但这与OP的问题无关。

答案 4 :(得分:0)

答案是直接的,因为C没有按原样实现函数重载。它可能允许你改变一个或两个参数,但内部发生的事情不是函数重载的实际机制。

  

当调用重载函数时,C ++编译器会选择   通过检查数量,类型和顺序来确定适当的功能   通话中的参数。函数重载通常用于创建   几个同名的函数,执行类似的任务但是   不同的数据类型。

我真的不明白你的问题,但一般来说,函数重载取决于参数的不同。

方法的论据。

public int add(int a,int b)

public float add(float a,float b)

这是函数重载。至少其中一个参数必须更改才能使函数重载。这在c的早期版本中是不可能的,因为它们不会通过传递的参数类型来识别函数。

答案 5 :(得分:0)

不,这不是函数重载的示例。

真正的重载意味着你有几个具有相同名称的不同的函数,但是通过它们的参数列表来区分。根据您传递的参数,将调用不同的函数实例。

答案 6 :(得分:0)

Overloading 表示将多个合同绑定到同一个名称。 例如:

int a(int i1, int i2);
int a(char c);
int a();

这在C中不存在,因为符号必须在同一范围内是唯一的,但这在C ++中存在。

因此,即使可以通过多种方式调用它,使用不同的参数类型和数字,但是函数int a(int i, ...);不能被视为C中的重载,因为只有一个契约,即“给我你想要的论据,我会找到办法处理它们“。

但在这种情况下,这个函数可以看作是C ++中的重载:

int a(int i, ...);
int a();