我应该如何将NULL传递给va_list函数参数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我应该如何将NULL传递给va_list函数参数?相关的知识,希望对你有一定的参考价值。

我想将NULL传递给以下函数的第4个参数:

bool CCMenuItemToggle::initWithTarget(CCObject* target, SEL_MenuHandler selector, CCMenuItem* item, **va_list args**);

像这样:

CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback), NULL, NULL);

我在XCode(clang3.1)中构建它时没关系。但是当我将代码移植到android ndk(g ++ 4.7)时,它无法编译:

没有可行的从'int'转换为'va_list'(又名'__builtin_va_list')

我该怎么处理呢?

答案

我假设如果你只使用空的va_list而不是NULL,你的代码将会起作用。

CCMenuItemToggle::initWithTarget( this, menu_selector(GOSound::toggleButtonCallback)
                                , NULL, va_list() );

编辑:也许这个替代解决方案适用于两个编译器。

va_list empty_va_list = va_list();
CCMenuItemToggle::initWithTarget( this, menu_selector(GOSound::toggleButtonCallback)
                                , NULL, empty_va_list );
另一答案

我看到这个问题得到了解答,但这不是标准问题。以下代码将通过Visual Studio中的运行时错误;但是,它适用于g ++。

    va_list empty_va_list;
CCMenuItemToggle::initWithTarget( this, menu_selector(GOSound::toggleButtonCallback), NULL, empty_va_list );

更好的解决方案是创建一对辅助函数来构造一个空的va_list。

va_list CCMenuItemToggle::createEmptyVa_list()
{
   return doCreateEmptyVa_list(0);
}

va_list CCMenuItemToggle::doCreateEmptyVa_list(int i,...)
{
    va_list vl;
    va_start(vl,i);
    return vl;
}

将doCreateEmptyVa_list设为私有,然后在调用函数调用时

CCMenuItemToggle::initWithTarget( this, menu_selector(GOSound::toggleButtonCallback), NULL, CreateEmptyVa_list() );
另一答案

您不能将NULL作为函数的第四个参数传递。该函数需要va_list参数。一般情况下,NULL不是va_list对象的有效初始值。所以,你的问题的答案是:这是不可能的。

你应该如何处理它取决于你想要做什么。

以上是关于我应该如何将NULL传递给va_list函数参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将null值传递给简单注入器中的构造函数?

如何将 NSString 传递给调用 printf 的函数?

如何使用 ADO 和 VB 将 NULL 或空字符串传递给存储过程输入参数?

我可以将 argv 从 main 传递给 execv 吗?

可变参数模板调度程序

怎么将可变参数的函数的参数传递给另一个可变参数的函数