我看到了下面的函数签名,我想知道这个(省略号或者"..."
)是不是一种多态?
#include <fcntl.h>
int fcntl(int fd, int cmd, ... );
提前感谢。
我看到了下面的函数签名,我想知道这个(省略号或者"..."
)是不是一种多态?
#include <fcntl.h>
int fcntl(int fd, int cmd, ... );
提前感谢。
C语言不支持函数重载——一种基于编译时类型的特设多态,也不支持多重分派(即基于运行时类型的重载)。
为了在C中模拟函数重载,您需要创建多个命名不同的函数。这些函数的名称通常包含类型信息,例如用于字符的fputc()
和用于字符串的fputs()
。
可以通过使用可变宏来实现多重分派。同样,程序员需要提供类型信息,但这次是通过一个额外的参数,在运行时进行评估——与上述方法的编译时函数名相反。虽然printf()
系列函数可能不是多重分派的最佳示例,但我目前想不到更好的例子。
还有其他方法使用指针而不是可变函数或将值封装在结构中以提供类型注释来实现多重分派。
int printf(const char*, ...);
想一想。
你可以在C语言中编写支持多态行为的代码,但是省略号并没有什么帮助。省略号是用于函数的可变参数。
如果你想要多态行为,你可以使用联合和结构体来构建一个数据结构,该结构具有“类型”部分和根据类型变化的可变字段。你还可以在结构体中包含函数指针表。瞧!你已经发明了C++。