大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
__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;
}
为了在可变参数的函数内获得实际参数个数,可以用开始的参数指定,或者用某个参数的值来标志参数结束。

posted on 2009-06-21 12:52 大胖 阅读(172) 评论(0)  编辑 收藏 引用 所属分类: Others

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理