7

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

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”)

我应该如何处理?

4

3 回答 3

11

我假设如果您只使用空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 );
于 2013-03-10T11:42:31.077 回答
0

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

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

于 2014-04-29T23:34:12.970 回答
0

我看到这个问题得到了回答,但它不是标准的。以下代码将通过 Visual Studios 中的运行时错误;但是,它适用于 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() );
于 2014-04-29T22:22:32.893 回答