__cdecl
C调用约定,默认为此种方式,按从右至左的顺序压参数入栈,调用者负责参数压栈和清理。
对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。
__stdcall
Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,被调用的函数退出时清空堆栈。
可变参数的实现:
通过va_start宏我们可以取得可变参数表的首指针.
va_arg宏的意思则指取出当前arg_ptr所指的可变参数并将ap指针指向下一可变参数.
va_end宏被用来结束可变参数的获取,
va_end实际上被定义为空,没有任何真实对应的代码,用于代码对称,与va_start对应.
//可变参数
int sumi(int c, )
{
va_list ap;
_crt_va_start(ap,c);
int i;
int sum = c;
c = _crt_va_arg(ap,int);
while(0!=c)
{
sum = sum+c;
c = _crt_va_arg(ap,int);
}
_crt_va_end(ap);
return sum;
}
int main()
{
//当输入参数值为0时,表示结束
int i=sumi(1,2,3,4,5,6,7,8,9,0);
cout<<i<<endl;
return 0;
}
为了在可变参数的函数内获得实际参数个数,可以用开始的参数指定,或者用某个参数的值来标志参数结束。