Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1064067
  • 博文数量: 77
  • 博客积分: 11498
  • 博客等级: 上将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-04 11:10
文章分类

全部博文(77)

文章存档

2011年(1)

2010年(16)

2009年(5)

2008年(55)

分类: C/C++

2008-04-13 14:54:00


    本文简单讨论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)只有函数调用者知道参数的准确个数,因此只能由调用者弹出参数。

阅读(1803) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~