您的位置:首页 > 编程语言 > C语言/C++

c++可变长参数问题

2014-04-16 21:44 176 查看
在看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*);来获取实际参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: