c++可变长参数问题


在看cocos2dx的官方demo的时候发现函数CCSequence::create()是可变长参数,函数原型为:

Sequence* Sequence::create(FiniteTimeAction *action1, ...),在实际使用过程中,

CCSequence::create(actionBy, actionByBack,nullptr),必须要用null作为结尾,不然编译器会警告。


据我所知,在C语言里面,并没有这种情况的。不需要用NULL结尾,就像printf(),函数调用的时候,只需要把需要的参数传入就行。


关于这个问题,需要搞清楚几点:

1,va_list的实现;

va_list用宏实现,事实上只是得到可变长参数的首参数的地址而已,

具体获取参数还需要va_arg();


2,C函数调用和C++函数调用的差别;

目前并没有发现C和C++在可变长参数的处理上有什么差别,C++编译器上的警告只是编译器的友情提示而已。

因为如果处理可变长参数的函数不确定参数个数的情况下,需要用NULL指针来确认结束标示。



代码:

Sequence* Sequence::create(FiniteTimeAction *action1, ...)

{

    va_list params;

    va_start(params, action1);


    Sequence *ret = Sequence::createWithVariableList(action1, params);


    va_end(params);

    

    return ret;

}

中,params并没有将实际的参数取出来,而仅仅得到参数的首地址而已,在后面的处理中,根据函数

 now = va_arg(args, FiniteTimeAction*);来获取实际参数。









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值