<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |