本文简单讨论C/C++中变参函数与default argument promotions间的关系。
作者:tyc611.cublog.cn,2008-04-13
一直没弄明白*printf系统函数怎么可以对同一参数进行不同的解释,如对char类型的实参可以用%c解释,也可以用%d解释。前日又想到了这个问题,于是到坛子里发了一帖,以盼解决心中的疑惑。原帖见。
经whyglinux指点,终于找到了问题的答案,这源于C/C++对没有原型声明的变参有专门的处理规则。引自C99标准文档:
C99 6.5.2.2-6 If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions. |
因此,之所以*printf系统函数怎么可以对同一参数进行不同的解释,这是受益于default argument promotions规则,但也受制于该规则。任何违反该规则的变参函数实现或者调用产生的行为都是未定义的。
顺便谈点相关话题。变参函数只能采用与cdcel类似的调用约定,即:参数入栈顺序从右向左,由函数调用者弹出参数。原因在于,(1)被调用函数只知道前面类型确定的几个参数,而不知道后面有多少个变参,因此,只有将确定类型参数最后压入,通过这些参数去查询变参,才能够访问所有参数;(2)只有函数调用者知道参数的准确个数,因此只能由调用者弹出参数。
阅读(1840) | 评论(0) | 转发(0) |