2011-08-25 68 views
2

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

+4

这个分类对你有什么好处? – cnicutar

+1

我认为这纯粹是“超载”意味着什么的问题。我个人不会称这种重载,但它**可能**实现一个丑陋的版本在C中使用预处理器与可变宏和可怕的黑客来测试参数的类型... –

回答

2

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

1

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

从编译器的角度来看,只有一个函数被实例化。从用户的持续性来看,你可能会调用这个“重载”,但它不是由语言或编译器来强制执行的。

1

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

0

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

当一个重载的函数被调用时,C++编译器通过检查在该呼叫的 参数的数量,类型和顺序选择 正常功能。函数重载通常用于创建几个执行类似任务但具有不同数据类型的名称相同的函数。

我真的不明白你的问题,但在一般的函数重载取决于参数的差异。

该方法的参数。

公众诠释加载(INT A,INT B)

公共浮添加(浮起,浮子B)

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

+0

没有太多的答案国际海事组织(“C不支持函数重载”),但要指出的是,通常函数的返回不计算;) – cnicutar

+0

好的,我可以重新说明C没有实际实现函数重载概念的方式,它应该是 – swordfish

0

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

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

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

重载意味着不同的功能将被调用取决于数量和/或类型(s)的参数(一些语言也可以使用返回类型)。但在这种情况下,无论参数的数量多少,您都可以调用相同的函数。

这比func(42)func(43)没有更多的超载。

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

相关问题