c – varargs是否提供了一种穷人的多态性?

毫无疑问,C的每个其他学生都注意到了这一点;这对我来说是新的.

如果我宣布:

int xlate( void *,... );

然后以几种不同的方式定义xlate()(也许所有定义,但一个是#ifdef-ed out):

int xlate ( char *arg1 ) { ... }

int xlate ( int arg1,char *arg2,int arg3 ) { ... }

int xlate ( char arg1,int *arg2 ) { ... }

并省略任何提及va_list – 从不提及它 – 在每一个
xlate()的定义;然后调用xlate()遵守其中一个
几个定义,似乎每个编译版本的xlate()
按照我想要的方式工作,至少在gcc和msvc下.

在C99下保证这种放松,不严格,慷慨的编译器行为吗?

谢谢!

– 皮特

解决方法

除了caf的回答:

由于存在一些问题,这不起作用,标准除了禁止这样的事情之外别无能为力:

原型告诉调用方在调用函数时必须如何执行参数转换.您提供的示例已经不能可靠地用于第一个参数.你声明它为void *然后在另一个中声明为int.由于两者可能具有不同的宽度,因此在大多数64位体系结构中,您的代码将被判定为失败.

更糟糕的是,……符号告诉主叫方对剩余的参数应用认促销.例如,如果您的实现期望浮动,则调用方将始终提供双倍,并且再次,您的代码将严重崩溃(=最近).

然后,现代体系结构具有复杂的规则,它们将哪些类型的参数放在堆栈中并保存在寄存器中.这取决于参数的类型,例如整数和浮点具有不同的寄存器集.所以这会让你的论点完全错误.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...