函数调用方式

函数调用方式
__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 ;
}
为了在可变参数的函数内获得实际参数个数,可以用开始的参数指定,或者用某个参数的值来标志参数结束。

你可能感兴趣的:(函数调用方式)