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*);来获取实际参数。
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*);来获取实际参数。
相关文章推荐
- 浅谈C语言C++中可变参数问题!!!
- [c++][zz]透析C语言可变参数问题
- c++之指针作为函数参数传递的问题
- C++难点解析之可变参数
- C++中函数参数的对象值传递问题
- c/c++使用指针做函数返回值和指针作函数参数问题
- C++可变参数的另一种实现
- C/C++矩阵传参数问题
- C++ template的一些高级用法(元编码,可变参数,仿函数,using使用方法,. C++ 智能指针)
- [C++]遍历可变参数 (va_list)
- C#调用C++编写的DLL函数各种参数传递问题
- C++ 11 可变参数宏结合可变参数模板使用!
- 对C/C++可变参数表的深层探索
- 黑马程序员—反射调用main方法的问题总结(涉及可变参数)(反射参数是一个数组的函数要小心)
- 对C/C++可变参数表的深层探索3
- C++ 编码军规(001):不要使用包含可变参数列表的函数
- C语言中的可变参数宏/函数,及可变参数在函数中的传递问题全解析
- C/C++中可变参数的用法详细解析
- ubuntu 下的C++多线程遇到的问题(2)--向线程传递参数
- C语言之可变参数问题