当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>c/c++支持可变参数的函数</b>[VC/C++编程]

赞助商链接



  本文“<b>c/c++支持可变参数的函数</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

1、为什么要利用可变参数的函数?

普通我们编程的时刻,函数中情势参数的数目普通是肯定的,在调用时要顺次给出与情势参数对应的全部实际参数.但在某些情形下但愿函数的参数个数可以按照需求肯定,因此c语言引入可变参数函数.这也是c功效强盛的一个方面,别的某些语言,比方fortran就没有这个功效.

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

2、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        ;调用者负责清栈

假如调用函数的时刻利用的调用协议和函数原型中声明的不一致,就会招致栈错误,这是别的一个话题,这里不再细说.

别的c/c++编译器采取宏的情势支持可变参数函数.这些宏包含va_start、va_arg和va_end等.之所以这么做,是为了增添程序的可移植性.屏蔽差别的硬件平台造成的差别.

支持可变参数函数的全部宏都定义在stdarg.h 和 varargs.h中.比方尺度ANSI情势下,这些宏的定义是:

typedef char * va_list; //字符串指针

#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap)      ( ap = (va_list)0 )

利用宏_INTSIZEOF是为了按照整数字节对齐指针,因为c调用协议下面,参数入栈都是整数字节(指针大概值).

3、若何定义这类的函数.

可变参数函数在差别的系统下,采取差别的情势定义.

1、用ANSI尺度情势时,参数个数可变的函数的原型声明是:

type funcname(type para1, type para2, ……);


  以上是“<b>c/c++支持可变参数的函数</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .