ci传递可变数量的参数特征-函数重载

  • 本文关键字:特征 参数 函数 重载 ci
  • 更新时间 :
  • 英文 :


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

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

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

实际上,答案可能是"是"或"否",这取决于你对"函数重载"的定义。

从编译器的角度来看,只实例化了一个函数。从用户的角度来看,您可以称其为"重载",但语言和编译器都没有强制执行。

No.

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

这并不比func(42)func(43)更重载。

注意C99确实有一些的行为很像一种狭义的重载形式。如果您有#include <tgmath.h>,那么sqrt(x)将根据x的类型调用三个不同的函数(sqrtf()sqrt()sqrtl())之一。但这实际上是一个"类型泛型",而不是一个重载函数。C11添加了_Generic关键字,使用户编写的代码可以使用此功能。但这与OP的问题无关。

不,这不是一个函数重载的例子。

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

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

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

我不太明白你的问题,但一般情况下,函数重载取决于参数的不同。

方法的参数。

public int add(a, b)

public float add(a, b)

这是函数重载。函数要被重载,至少需要改变其中一个参数。这在早期的c版本中是不可能的,因为它们不能通过传递的参数类型来识别函数。

重载意味着将多个契约绑定到同一个名称。例如:

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

最新更新