当前位置:主页   - 电脑 - 程序设计 - C/C++
c/c++支持可变参数的函数
来源:网络   作者:   更新时间:2012-02-07
收藏此页】    【字号    】    【打印】    【关闭

  一、为什么要使用可变参数的函数?

   一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数。这也是c功能强大的一个方面,其它某些语言,比如fortran就没有这个功能。

   典型的可变参数函数的例子有大家熟悉的printf()、scanf()等。

   二、c/c++如何实现可变参数的函数?

   为了支持可变参数函数,C语言引入新的调用协议, 即C语言调用约定 __cdecl . 采用C/C++语言编程的时候,默认使用这个调用约定。如果要采用其它调用约定,必须添加其它关键字声明,例如WIN32 API使用PASCAL调用约定,函数名字之前必须加__stdcall关键字。

   采用C调用约定时,函数的参数是从右到左入栈,个数可变。由于函数体不能预先知道传进来的参数个数,因此采用本约定时必须由函数调用者负责堆栈清理。举个例子:

 //C调用约定函数
   int __cdecl Add(int a, int b)
   {
      return (a + b);
   }

   函数调用:
   Add(1, 2);
   //汇编代码是:
   push        2            ;参数b入栈
   push        1            ;参数a入栈
   call        @Add         ;调用函数。其实还有编译器用于定位函数的表达式这里把它省略了
   add         esp,8        ;调用者负责清栈

   如果调用函数的时候使用的调用协议和函数原型中声明的不一致,就会导致栈错误,这是另外一个话题,这里不再细说。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明