在C语言的参数列表中,...代表什么?

39

我看到了下面的函数签名,我想知道这个(省略号或者"...")是不是一种多态?

#include <fcntl.h>
int fcntl(int fd, int cmd, ... );

提前感谢。


4
公平的问题。+1。尽管有权力机构的指示表明简单的问题是适宜的,但仍有些人认为不适合提出。 - paxdiablo
我建议将问题的标题更改为“C语言中的省略号(...)是什么?” - Hosam Aly
@Hosam:是的,这并不是关于多态性的问题... 标题已更改。 - Dave Sherohman
@Dave Sherohman:这也不是关于省略号的问题。 - Anonymous
你为什么改了标题 - 应该清楚地表明这个问题与多态有关,尽管C不支持它。 - Anonymous
1
很明显,你看到省略号就认为它意味着多态性。但实际上并不是这样的。第二个问题可能是:“既然省略号不表示多态性,那么有没有其他方法可以实现它?” 这将是一个单独的问题。 - John Saunders
14个回答

0

C语言不支持函数重载——一种基于编译时类型的特设多态,也不支持多重分派(即基于运行时类型的重载)。

为了在C中模拟函数重载,您需要创建多个命名不同的函数。这些函数的名称通常包含类型信息,例如用于字符的fputc()和用于字符串的fputs()

可以通过使用可变宏来实现多重分派。同样,程序员需要提供类型信息,但这次是通过一个额外的参数,在运行时进行评估——与上述方法的编译时函数名相反。虽然printf()系列函数可能不是多重分派的最佳示例,但我目前想不到更好的例子。

还有其他方法使用指针而不是可变函数或将值封装在结构中以提供类型注释来实现多重分派。


0
标准库中的printf声明为:
int printf(const char*, ...); 

想一想。


0

你可以在C语言中编写支持多态行为的代码,但是省略号并没有什么帮助。省略号是用于函数的可变参数。

如果你想要多态行为,你可以使用联合和结构体来构建一个数据结构,该结构具有“类型”部分和根据类型变化的可变字段。你还可以在结构体中包含函数指针表。瞧!你已经发明了C++。


-5

是的,C语言支持多态性。

使用虚函数实现多态性时,在C++中编写的代码会被编译器转换为C代码(详细信息在此可以找到)。

众所周知,C++中的虚函数功能是通过函数指针来实现的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接